#include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
#include"apue.h" #include"stdio.h" #include"myerr.h" static void sig_usr(int); int main() { if(signal(SIGUSR1,sig_usr) == SIG_ERR) { err_sys("signal error\n"); } if(signal(SIGUSR2,sig_usr) == SIG_ERR) { err_sys("can‘t catch SIGUSR2"); } for(;;) { pause(); } return 0; } static void sig_usr(int signo) { if(signo == SIGUSR1) { printf("received SIGUSR1\n"); } else if(signo == SIGUSR2) { printf("received SIGUSR2\n"); } else { err_dump("received signal %d\n",signo); } }
for(;;) { pause(); }
在需要时用户可以恢复进程的运行,将被挂起的进程从后台转入前台,并从暂停处开始继续运行。
jasonleaster@ubuntu:/Ad_Pro_in_Unix/chapter_10$ ./a.out &[1] 3310jasonleaster@ubuntu:/Ad_Pro_in_Unix/chapter_10$ kill -USR1 3310jasonleaster@ubuntu:/Ad_Pro_in_Unix/chapter_10$ received SIGUSR1
但是为什么送第二次相同的信号就死掉了呢?
原因在这里
if(signal(SIGUSR1,sig_usr) == SIG_ERR) { err_sys("signal error\n"); } if(signal(SIGUSR2,sig_usr) == SIG_ERR) { err_sys("can‘t catch SIGUSR2"); }这个就是创建signal handler函数的语句。
我们必须非常仔细的注意,这里的signal handler的declaration:
static void sig_usr(int);
static的作用并不是把函数放在 静态内存区域,而是限定函数的作用域。signal handler是在stack上面的!
这才是问题的关键!这么以来,上面的code就只将sig_usr 载入了两次,一次给SIGUSR 1,一次给SIGUSR2
触发signal handler之后是会被弹栈的!这个时候signal handler就木有了!
之后如果继续向signal handler 发送信号就会触发default behaviour for SIGUSR1 and SIGUSR2.
他们的default behaviour就是termination 。。。so 程序挂掉。
if(signal(SIGUSR1,sig_usr) == SIG_ERR) { err_sys("signal error\n"); } if(signal(SIGUSR2,sig_usr) == SIG_ERR) { err_sys("can‘t catch SIGUSR2"); }
/********************************************************************* code writer : EOF code date : 2014.03.31 e-mail : jasonleaster@gmail.com code purpose : I would like to share my code with someone like me. Just a demo for signal function. The signal would be loaded to stack.Load once, pop once. **********************************************************************/ #include"apue.h" #include"stdio.h" #include"myerr.h" static void sig_usr(int); int main() { int temp = 0; if(signal(SIGUSR1,sig_usr) == SIG_ERR) { err_sys("signal error\n"); } if(signal(SIGUSR2,sig_usr) == SIG_ERR) { err_sys("can‘t catch SIGUSR2"); } for(temp = 0;1;temp++) { pause(); if(temp < 1) { if(signal(SIGUSR1,sig_usr) == SIG_ERR) { err_sys("signal error\n"); } if(signal(SIGUSR2,sig_usr) == SIG_ERR) { err_sys("can‘t catch SIGUSR2"); } } } return 0; } static void sig_usr(int signo) { if(signo == SIGUSR1) { printf("received SIGUSR1\n"); } else if(signo == SIGUSR2) { printf("received SIGUSR2\n"); } else { err_dump("received signal %d\n",signo); } }
signal 函数只能接受一次信号? The naughty signal function,布布扣,bubuko.com
signal 函数只能接受一次信号? The naughty signal function
原文:http://blog.csdn.net/cinmyheart/article/details/22655659