1.信号的四要素
\qquad信号的名字;信号的编号;信号的默认处理动作;信号的事件
2.信号相关命令
\qquad查看linux下的所有信号:kill -l
;查看信号文档:man 7 signal
。一共有64个信号。linux常规信号一览表
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) 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
3.信号的默认动作
动作 | 意义 |
---|---|
Term | 终止进程 |
lgn | 忽略信号 |
Core | 终止进程,生成core文件 |
Stop | 停止(暂停)进程 |
Cont | 继续运行进程 |
\qquad对于信号的处理,有执行默认动作,忽略和捕捉,其中 9)SIGKILL和 19)SIGSTOP,不允许捕捉和忽略,只能执行默认动作。
4.信号的产生
4.1 终端按键产生信号
按键操作 | 信号 | 说明 |
---|---|---|
ctrl + c | 2:SIGINT(终止/中断) | INT:interrupt |
ctrl + z | 20:SIGTSTP(暂停/停止) | T:terminal STP:stop |
ctrl + \ | 3:SIGQUIT(退出) |
4.2 硬件异常产生信号
异常操作 | 信号 |
---|---|
除0操作 | 8:SIGFPE |
非法访问内存 | 11:SIGSEGV(段错误) |
总线错误 | 7:SIGBUS |
4.3 kill函数或者kill命令产生信号
4.3.1 kill命令产生信号
kill -9 10624 // 给进程10624发送9)SIGKILL信号
4.3.2 kill函数
\qquadint kill(pid_t pid,int sig)
\qquad功能:给指定进程发送指定信号(不一定杀死)
\qquad返回值:成功返回0;失败返回-1
\qquad参数:第一个参数:pid>0,发送信号给指定进程;pid=0,发送信号给与调用kill函数进程属于同一进程组的所有进程;pid<0,取|pid|发送给对应进程组;pid=-1,发送给进程有权发送的系统中的所有进程。 第二个参数:sig不推荐使用数字,建议使用宏名
\qquad举例:调用kill函数,自己把自己杀死
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>int main()
{int ret = kill(getpid(),SIGKILL);if(ret==-1){perror("kill error!");exit(1);}return 0;
}
5.举例
\qquad创建5个子进程,然后依次杀死
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<errno.h>
#include<stdlib.h>
#include <sys/types.h>
#include <signal.h>int main()
{pid_t pid,q[5];int i;for(i=0;i<5;i++){pid = fork();if(pid==-1){perror("fork error!");exit(1);}else if(pid==0){break;}q[i]=pid;}if(i<5){while(1){printf("i am child %d,getpid()=%d\n",i,getpid());sleep(1);}}else{for(i=0;i<5;i++){sleep(2);kill(q[i],SIGKILL);}}return 0;
}