linux中signal函数的简单用法

2019-07-13 03:38发布

信号是软件中断,它提供了一种处理异步事件的方法,每个信号有个以SIG打头的名字,讲signal函数之前我们先了解下当前系统所支持的信号名称,在linux中敲下kill -l就能查看。  
  1. [lingyun@localhost file]$ kill -l
  2. 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
  3. 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
  4. 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
  5. 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
  6. 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
  7. 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
  8. 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
  9. 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
  10. 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
  11. 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
  12. 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
  13. 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
  14. 63) SIGRTMAX-1 64) SIGRTMAX
kill默认发送SIGTERM的信号,若其被signal捕捉,那我们也不慌,记住一招,kill -9 加进程号或者是killall -9 加进程名发送SIGKILL的信号,任何程序都会被秒杀。      
  1. [lingyun@localhost file]$ ps aux | grep a.out
  2. lingyun 11414 0.0 0.0 22596 412 ? Ssl Jan31 0:01 ./a.out
  3. lingyun 12091 0.0 0.0 22596 412 ? Ssl 00:19 0:00 ./a.out
  4. lingyun 13364 0.0 0.0 6056 820 pts/1 S+ 04:32 0:00 grep a.out
  5. [lingyun@localhost file]$ kill -9 11414
  6. [lingyun@localhost file]$ ps aux | grep a.out
  7. lingyun 12091 0.0 0.0 22596 412 ? Ssl 00:19 0:01 ./a.out
  8. lingyun 13366 0.0 0.0 6056 796 pts/1 S+ 04:33 0:00 grep a.out
  9. [lingyun@localhost file]$ killall -9 a.out
  10. [lingyun@localhost file]$ ps aux | grep a.out
  11. lingyun 13369 0.0 0.0 6052 784 pts/1 S+ 04:33 0:00 grep a.out
  12.  
给大家看一个特别简单的signal函数的调用,在看程序之前,咱们先要知道键盘上的ctrl加c对操作系统发送的是SIGINT的信号,我们试图去捕捉这个信号,然后再干其他的事情。  
  1. #include
  2. #include
  3. #include
  4. #include
  5. int g_alarm = 0;
  6. void sig_catch(int signum)
  7. {
  8. printf("Catch signal [%d] ", signum); //捕捉到SIGINT后打印这个
  9. return;
  10. }
  11. int main(int argc,char *argv[])
  12. {
  13. printf("program %s start running ",argv[0]); //打印第一个参数
  14. signal(SIGINT, sig_catch); //捕捉SIGINT的信号函数
  15. alarm(10); //闹钟,十秒后程序自动退出
  16. while(1);
  17. {
  18. sleep(10);
  19. }
  20. }
接着我们看执行结果,在执行的时候咱们试着多次按ctrl加c试图结束程序,可它就像个病毒一样,停不下来,只有等待闹钟的十秒钟结束,它才会静静自行安息。  
  1. [lingyun@localhost file]$ gcc signal.c
  2. [lingyun@localhost file]$ ./a.out
  3. program ./a.out start running
  4. ^CCatch signal [2]
  5. ^CCatch signal [2]
  6. ^CCatch signal [2]
  7. ^CCatch signal [2]
  8. ^CCatch signal [2]
  9. ^CCatch signal [2]
  10. ^CCatch signal [2]
  11. ^CCatch signal [2]
  12. ^CCatch signal [2]
  13. ^CCatch signal [2]
  14. ^CCatch signal [2]
  15. ^CCatch signal [2]
  16. ^CCatch signal [2]
  17. ^CCatch signal [2]
  18. ^CCatch signal [2]
  19. ^CCatch signal [2]
  20. ^CCatch signal [2]
  21. 闹钟