这几天,被公司的两个模块的程序好好的搞了一下,开始以为是SHELL的问题,仔细研究了以下,原来没有想象的那么复杂!!!

      关键在使用的信号SIGALRM 上,两个进程都用可SIGALRM 信号,一个进程在处理函数上启动了另一个进程,导致发给被启动进程的SIGALRM 被屏蔽掉了,最后的结果是被启动进程不能正常运行!!!!

     查了查书,发现还有个SIGPROF,呵呵.打算用SIGPROF来作为一个进程的信号,先写个测试程序看看管不管用

sigprof.c代码如下:
#include <stdio.h>
#include <math.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
void prompt_info(int signo)
{
printf("can i be called!!!\n");
system("./test");
}
void init_sigaction(void)
{
struct sigaction act;
act.sa_handler=prompt_info;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGPROF,&act,NULL);
}
void init_time()
{
struct itimerval value;
value.it_value.tv_sec=2;
value.it_value.tv_usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_PROF,&value,NULL);
}
int main()
{
init_sigaction();
init_time();
while(1);
exit(0);
}
在RED HAT 9.0下编译
gcc -o sigprof sigprof.c
test.c的代码如下:
#include <stdio.h>
#include <math.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
void prompt_info()
{
//system("./sigprof");
printf("this is a test!!!!!!\n");
}
void init_sigaction(void)
{
struct sigaction act;
act.sa_handler=prompt_info;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM,&act,NULL);
}
void init_time()
{
struct itimerval value;
value.it_value.tv_sec=20;
value.it_value.tv_usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_REAL,&value,NULL);
}
int main()
{
init_sigaction();
init_time();
while(1);
exit(0);
}
在RED HAT 9.0下编译
gcc -o test test.c
运行./sigprof
结果如下:
can i be called!!!
this is a test!!!!!!
this is a test!!!!!!
this is a test!!!!!!
this is a test!!!!!!
this is a test!!!!!!
this is a test!!!!!!
this is a test!!!!!!
this is a test!!!!!!
this is a test!!!!!!
this is a test!!!!!!
this is a test!!!!!!
看来信号还是被屏蔽掉了!!!! 两者的关系对调一下: sigprof.c代码如下:
#include <stdio.h>
#include <math.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
void prompt_info(int signo)
{
printf("can i be called!!!\n");
//system("./test");
}
void init_sigaction(void)
{
struct sigaction act;
act.sa_handler=prompt_info;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGPROF,&act,NULL);
}
void init_time()
{
struct itimerval value;
value.it_value.tv_sec=2;
value.it_value.tv_usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_PROF,&value,NULL);
}
int main()
{
init_sigaction();
init_time();
while(1);
exit(0);
}
在RED HAT 9.0下编译
gcc -o sigprof sigprof.c
test.c的代码如下:
#include <stdio.h>
#include <math.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
void prompt_info()
{
system("./sigprof");
printf("this is a test!!!!!!\n");
}
void init_sigaction(void)
{
struct sigaction act;
act.sa_handler=prompt_info;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM,&act,NULL);
}
void init_time()
{
struct itimerval value;
value.it_value.tv_sec=20;
value.it_value.tv_usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_REAL,&value,NULL);
}
int main()
{
init_sigaction();
init_time();
while(1);
exit(0);
}
在RED HAT 9.0下编译
gcc -o test test.c 运行./test
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
can i be called!!!
还是失败!!!!!!
换个思维,不在处理函数启动另一个进程
#include <stdio.h>
#include <math.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
int i=0;
void prompt_info()
{
i++;
//system("./sigprof");
printf("this is a test!!!!!!\n");
}
void init_sigaction(void)
{
struct sigaction act;
act.sa_handler=prompt_info;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM,&act,NULL);
}
void init_time()
{
struct itimerval value;
value.it_value.tv_sec=2;
value.it_value.tv_usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_REAL,&value,NULL);
}
int main()
{
init_sigaction();
init_time();
while(1)
{
if(i==1) system("./sigprof");
};
exit(0);
}
在RED HAT 9.0下编译
gcc -o test test.c 运行./test
结果:
this is a test!!!!!!
this is a test!!!!!!
can i be called!!!
this is a test!!!!!!
can i be called!!!
this is a test!!!!!!
can i be called!!!
this is a test!!!!!!
can i be called!!!
this is a test!!!!!!
can i be called!!!
this is a test!!!!!!
can i be called!!!
this is a test!!!!!! OK
达到想要的目的!!
问题解决!!!!

SIGPROF和SIGALRM使用总结的更多相关文章

  1. PHP 信号管理

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  2. 【转载】Linux 信号列表

    转自:http://blog.csdn.net/muge0913/article/details/7322710 信号及其简介 信号是一种进程通信的方法,他应用于异步事件的处理.信号的实现是一种软中断 ...

  3. (八) 一起学 Unix 环境高级编程 (APUE) 之 信号

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. linux kill信号列表

    linux kill信号列表 $ kill -l1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL5) SIGTRAP      6) ...

  5. linux 信号列表和基本作用

    我们运行如下命令,可看到Linux支持的信号列表: $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7 ...

  6. iOS异常捕获

    文章目录 一. 系统Crash 二. 处理signal 下面是一些信号说明 关键点注意 三. 实战 四. Crash Callstack分析 – 进⼀一步分析 五. demo地址 六. 参考文献 前言 ...

  7. Linux信号列表

    我们运行如下命令,可看到Linux支持的信号列表: ~$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) ...

  8. 【转】linux trap

    在有些情况下,我们不希望自己的shell脚本在运行时刻被中断,比如说我们写得shell脚 本设为某一用户的默认shell,使这一用户进入系统后只能作某一项工作,如数据库备份, 我 们可不希望用户使用c ...

  9. linux-信号。

    信号 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的. 信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到 ...

随机推荐

  1. Expression Trees (C# and Visual Basic)

    https://msdn.microsoft.com/en-us/library/bb397951.aspx Expression trees represent code in a tree-lik ...

  2. Android Calendar的运用

    import java.text.DateFormat; import java.text.ParsePosition; import java.text.SimpleDateFormat; impo ...

  3. local_response_normalization 和 batch_normalization

    Normalization   Normalization local_response_normalization local_response_normalization出现在论文”ImageNe ...

  4. 86. Ext文本输入框:Ext.form.TextField属性汇总

    转自:https://blog.csdn.net/ryuudenne/article/details/8834650 Ext.form.TextField主要配置表: allowBlank       ...

  5. XML案例(使用JAXP进行DOM解析)

    1.book.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> ...

  6. Ruby 各种离奇运算符

    创建: 20170717 更新: 改变分类 Rails ---> Ruby 更新: 2017/10/16 增加&., #try 参考: 传送门  ||=   a ||= b相当于 a = ...

  7. go的接口

    一.接口定义 接口类型 在讲基础数据类型时,我们曾提了一下 interface 数据类型,这个数据类型就是接口类型 什么是接口 Go 语言不是"传统"的面向对象的编程语言:它里面没 ...

  8. Java多线程技术-Volatile关键字解析

    分析volatile关键字可以从这三个方面分析,什么是程序的原子性,什么是程序的可见性,什么是程序的有序性 什么是程序的原子性 以下语句那些是原子操作? public class ThreadCoun ...

  9. 自定义View(6)paint设置两个图层相交时的显示方式,包含清空canvas

    1.问题 在已有的图层上绘图将会在其上面添加一层新的图层. 如果新的图层是完全不透明的,那么它将完全遮挡住下面的图层,而setXfermode就可以来解决这个问题.这个函数设置两个图层相交时的模式 . ...

  10. 如何正确从windows系统(自己电脑)远程访问Linux系统(他人电脑)的mysql数据库(图文详解)

    这里,需要Linux系统开了root用户,我这给root用户密码为root.     同时,在mysql -uroot -proot执行进去之后 update user setHost='%' whe ...