signal()函数
例子
#include<stdio.h>
#include<signal.h>
#include <unistd.h>
typedef sighandler_t SignalHandler;
static SignalHandler g_handler1Pre=NULL;
static SignalHandler g_handler2Pre=NULL;
static SignalHandler g_handler3Pre=NULL;
void handler1(int signo)
{
printf("handler1 catch a signal: %d\n",signo);
if(g_handler1Pre != NULL) {
g_handler1Pre(signo);
} else {
printf("g_handler1Pre is null.\n");
}
}
void handler2(int signo)
{
printf("handler2 catch a signal: %d\n",signo);
if(g_handler2Pre != NULL) {
g_handler2Pre(signo);
} else {
printf("g_handler2Pre is null.\n");
}
}
int main()
{
printf("register handler1.\n");
if (g_handler1Pre = signal(2,handler1)){
if (g_handler1Pre == SIG_DFL) {
printf("g_handler1Pre is SIG_DFL.\n");
return -1;
}
if (g_handler1Pre == SIG_IGN) {
printf("g_handler1Pre is SIG_IGN.\n");
return -1;
}
if (g_handler1Pre == SIG_ERR) {
printf("g_handler1Pre is SIG_ERR.\n");
return -1;
}
}
printf("register handler2.\n");
if (g_handler2Pre = signal(2,handler1)){
if (g_handler2Pre == SIG_DFL) {
printf("g_handler2Pre is SIG_DFL.\n");
return -1;
}
if (g_handler2Pre == SIG_IGN) {
printf("g_handler2Pre is SIG_IGN.\n");
return -1;
}
if (g_handler2Pre == SIG_ERR) {
printf("g_handler2Pre is SIG_ERR.\n");
return -1;
}
}
while(1)
{
printf("running...\n");
sleep(1);
}
return 0;
}
执行结果
$ ./a.out
register handler1.
register handler2.
running...
running...
running...
^Chandler1 catch a signal: 2
g_handler1Pre is null.
running...
running...
^Z
[10]+ Stopped
signal函数解释
//向信号量sig注册一个处理函数func
sighandler_t signal(int sig, void (*func)(int))
两个参数:
- 信号量
- 信号处理函数
返回值可能为
- SIG_DFL(默认的信号处理程序)
- SIG_IGN(忽视信号)
- SIG_ERR(信号错误)
- 之前的信号处理函数
查看信号量
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX