这几天,被公司的两个模块的程序好好的搞了一下,开始以为是SHELL的问题,仔细研究了以下,原来没有想象的那么复杂!!! 关键在使用的信号SIGALRM 上,两个进程都用可SIGALRM 信号,一个进程在处理函数上启动了另一个进程,导致发给被启动进程的SIGALRM 被屏蔽掉了,最后的结果是被启动进程不能正常运行!!!! 查了查书,发现还有个SIGPROF,呵呵.打算用SIGPROF来作为一个进程的信号,先写个测试程序看看管不管用
sigprof.c代码如下:#include#include #include #include #include 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.ctest.c的代码如下:#include #include #include #include #include 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 #include #include #include #include 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.ctest.c的代码如下:#include #include #include #include #include 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运行./testcan 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 #include #include #include #include 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达到想要的目的!!问题解决!!!!