前言
本章主要介紹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函數的接口以及使用例程。