unix signal信号捕捉机制

unix系统的信号机制最简单的接口是signal函数.
#include <signal.h>
void (*signal(int signo, void (*func) (int) ) ) (int);
写成:
typedef void sigfunc(int);

sigfunc *signal(int, sigfunc *);


signo表示信号名,后面的表示处理函数地址,如果使用系统默认的,则使用SIG_DFL

当指定函数地址时,则在信号发生时,会自动调用该函数,我们就称这种处理为“捕捉”该信号。

看一个实际的例子:


#include "apue.h"
static void sig_usr(int); /* one handler for both signals */

int
main(void)
{

//先指定函数地址,即如果发生了SIGUSR1或者SIGURS2信号,则内核会调用sig_usr()进行处理
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
err_sys("can't catch SIGUSR1");
if (signal(SIGUSR2, sig_usr) == SIG_ERR)
err_sys("can't catch SIGUSR2");
for ( ; ; )
pause();   //等待信号,此时如果是SIGUSR1或者SIGURS2信号,则会被“捕捉”,其他信号以默认方式处理
}


static void
sig_usr(int signo) /* argument is signal number */
{
if (signo == SIGUSR1)
printf("received SIGUSR1\n");
else if (signo == SIGUSR2)
printf("received SIGUSR2\n");
else
err_dump("received signal %d\n", signo);
}

你可能感兴趣的:(unix,Signal)