#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int)
//成功返回以前的信号处理配置,出错返回SIG_ERR
参数signo是信号名,func的值是常量SIG_IGN,SIG_DFL或者接到此信号以后要调用的参数的地址
SIG_IGN:向内核标识忽略此信号
SIG_DFL:表示接到此信号以后动作是系统默认动作。
当func为指定函数地址的时候,则在信号发生的时候调用该函数,我们称这种处理为捕捉信号。实示例程序
#include "apue.h"
static void sig_usr(int);
int main()
{
if(signal(SIGUSR1,sig_usr)==SIG_ERR)
err_sys("can not catch SIGUSR1");
if(signal(SIGUSR2,sig_usr)==SIG_ERR)
err_sys("can not catch SIGUSR2");
for(;;)
pause();
}
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);
}
运行结果
1.程序启动
当执行一个程序的时候,所有信号的状态都是系统默认或者忽略。通常所有的信号都被设置为它们的默认动作,除非调用exec忽略该进程信号。
2.进程创建
当一个进程调用fork的时候,其子进程继承父进程的信号处理方式