博客逐步迁移到,独立博客,原文地址http://www.woniubi.cn/two_groups_signal_difference/
之前看信号的时候,没有太注意不同信号的对比.今天再次看到的时候,突然感觉对一些信号,非常相似,乃至非常容易混淆.今天周末就抽空总结一下.
第一组 关闭进程信号常见的4中关闭进程信号是SIGKILL,SIGINT,SIGTERM,SIGQUIT.
信号 | 是否可以被捕获 | 键盘快捷键 | 是否产生core文件 |
SIGKILL | 否 | ||
SIGINT | 是 | ctrl+c | |
SIGTERM | 是 | ||
SIGQUIT | 是 | ctrl+/ | 是 |
键盘快捷键最大的好处就是发给所有的进程。
最下面我们用程序来验证一下。
第一组 关闭进程信号 程序验证先上代码。
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>void PRocess(int signo){ printf("signo:%d,pid:%d/n",signo,getpid());}void cleanup(){ printf("cleanup,pid:%d/n",getpid());}int main(){ pid_t pid; atexit(cleanup); signal(SIGINT, process); signal(SIGTERM, process); //signal(SIGQUIT, process); if( (pid = fork()) == 0 ) { printf("child pid:%d/n",getpid()); while(1){ sleep(1); } }else{ printf("parent pid:%d/n",getpid()); while(1){ sleep(1); } } return 0;}
SIGKILL比较简单,我们就不再验证了。先验证一下SIGINT。
可以看到输入ctrl+c的时候,父子进程都收到相关的信号。但是我输入kill -2 742的时候,只有父进程收到了,不会传给子进程。
下面我们验证SIGQUIT产生core。
可能部分的机器默认是不产生,我们需要输入几个命令。
#设置core文件大小,这里是无限制ulimit -c unlimited #core后面跟着pidsudo sysctl kernel.core_uses_pid=1#core文件存放路径,放在当前的文件夹下sudo sysctl kernal.core_pattern=core第二组 停止信号
这组信号对比,相对上一组就简单多了.
如果挂起之后,怎么再次让他们启动呢。简单一点,我们可以输入jobs,然后看一下他们的索引值。然后fg启动他们。
我们也可以给他们发送SIGCONT信号,让他们启动起来。不过这个时候,他们的只能在后台运行了。
这个时候,就可以看到他们的状态从T变成了S,从停止变成了运行状态。
新闻热点
疑难解答