前言
本章主要介绍signal及命令行发送SIGUSR1和SIGUSR2信号的处理。
一、函数signal
#include<signal.h>
void (*signal(int signo,void (*func)(int)))(int);
其中,参数1 signo为信号名,通常可以取值为SIGABRT SIGABRT SIGCHLD SIGGEMT SIGFPE SIGINT SIGUSR1 SIGUSR2;
参数2 func值可以是常量SIG_IGN(忽略此信号)、常量SIG_DFL(系统默认动作)、 当接收到此信号后要调用的函数地址
其中<signal.h>中定义了 #define SIG_ERR (void (*)())-1 #define SIG_DFL (void (*)())0 #define SIG_IGN (void (*)())1
也可以定义为 typedef void Sigfunc(int);然后,可以将signal函数原型写成Sigfunc *signal(int,Sigfunc*);
二、函数signal使用
1.signal
代码如下(示例):
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);
}
void unix_10_2_signal(void)
{
printf("catch sig SIGUSR1 and SIGUSR2")
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();
}
#define UNIX_10_2_SIGNAL
int main(int argc, char *argv[])
{
#ifdef UNIX_10_2_SIGNAL
unix_10_2_signal();
#endif
printf("MAIN END\n");
return 0;
} 程序运行步骤如下
./main & 在后台启动程序
kill -USR1 26225 向进程id为26225发送SIGUSR1信号
kill -USR2 26225 向进程id为26225发送SIGUSR2信号
kill 26225 终止此信号
运行图如下:
总结
本章主要介绍了signal函数的接口以及使用例程。