#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