1.信号的四要素
\qquad 信号的名字;信号的编号;信号的默认处理动作;信号的事件
2.信号相关命令
\qquad
查看linux下的所有信号:kill -l
;查看信号文档:man 7 signal
。一共有64个信号。linux常规信号一览表
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
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函数
\qquad
int 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;
}