#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);
}