信号是软件中断,它提供了一种处理异步事件的方法,每个信号有个以SIG打头的名字,讲signal函数之前我们先了解下当前系统所支持的信号名称,在linux中敲下kill -l就能查看。
-
[lingyun@localhost file]$ 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
kill默认发送SIGTERM的信号,若其被signal捕捉,那我们也不慌,记住一招,kill -9 加进程号或者是killall -9 加进程名发送SIGKILL的信号,任何程序都会被秒杀。
-
[lingyun@localhost file]$ ps aux | grep a.out
-
lingyun 11414 0.0 0.0 22596 412 ? Ssl Jan31 0:01 ./a.out
-
lingyun 12091 0.0 0.0 22596 412 ? Ssl 00:19 0:00 ./a.out
-
lingyun 13364 0.0 0.0 6056 820 pts/1 S+ 04:32 0:00 grep a.out
-
[lingyun@localhost file]$ kill -9 11414
-
[lingyun@localhost file]$ ps aux | grep a.out
-
lingyun 12091 0.0 0.0 22596 412 ? Ssl 00:19 0:01 ./a.out
-
lingyun 13366 0.0 0.0 6056 796 pts/1 S+ 04:33 0:00 grep a.out
-
[lingyun@localhost file]$ killall -9 a.out
-
[lingyun@localhost file]$ ps aux | grep a.out
-
lingyun 13369 0.0 0.0 6052 784 pts/1 S+ 04:33 0:00 grep a.out
-
给大家看一个特别简单的signal函数的调用,在看程序之前,咱们先要知道键盘上的ctrl加c对操作系统发送的是SIGINT的信号,我们试图去捕捉这个信号,然后再干其他的事情。
-
#include
-
#include
-
#include
-
#include
-
int g_alarm = 0;
-
void sig_catch(int signum)
-
{
-
printf("Catch signal [%d]
", signum); //捕捉到SIGINT后打印这个
-
return;
-
}
-
int main(int argc,char *argv[])
-
{
-
printf("program %s start running
",argv[0]); //打印第一个参数
-
signal(SIGINT, sig_catch); //捕捉SIGINT的信号函数
-
alarm(10); //闹钟,十秒后程序自动退出
-
while(1);
-
{
-
sleep(10);
-
}
-
}
接着我们看执行结果,在执行的时候咱们试着多次按ctrl加c试图结束程序,可它就像个病毒一样,停不下来,只有等待闹钟的十秒钟结束,它才会静静自行安息。
-
[lingyun@localhost file]$ gcc signal.c
-
[lingyun@localhost file]$ ./a.out
-
program ./a.out start running
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
^CCatch signal [2]
-
闹钟