博客逐步迁移到,独立博客,原文地址 http://www.woniubi.cn/two_groups_signal_difference/

之前看信号的时候,没有太注意不同信号的对比.今天再次看到的时候,突然感觉对一些信号,非常相似,乃至非常容易混淆.今天周末就抽空总结一下.

第一组 关闭进程信号

常见的4中关闭进程信号是SIGKILL,SIGINT,SIGTERM,SIGQUIT.

  1. SIGKILL,就是为了关闭进程用的,无法捕获以及忽略.场景是,管理员把一些占用资源的进程或者无法掌控的孤儿进程杀死.
  2. SIGINT,interrupt(中断)进程,这个是可以捕获以及忽略。可以使用ctrl+c发出信号,直接发给父进程以及子进程,这样的话就可以把这个程序所有的进程都可以关闭掉。
  3. SIGTERM,terminate(终止)进程,这个也是可以捕获以及忽略的。和SIGINT相比,就是没有相应的键盘控制命令。如果要去关闭所有的进程的话,只能挨个的发给所有的进程。
  4. SIGQUIT,quit(退出)进程,这个也是可以捕获以及忽略的。可以使用ctrl+\发出信号,直接发给父进程以及子进程。如果是不捕获的话,他就会产生core文件。
信号 是否可以被捕获 键盘快捷键 是否产生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后面跟着pid
sudo sysctl kernel.core_uses_pid=1
#core文件存放路径,放在当前的文件夹下
sudo sysctl kernal.core_pattern=core

第二组 停止信号

这组信号对比,相对上一组就简单多了.

  1. SIGSTOP,程序挂起,没有相应的快捷键,不能被捕获以及忽略。
  2. SIGTSTP,程序挂起,快捷键ctrl+z,可以被捕获以及忽略。

如果挂起之后,怎么再次让他们启动呢。简单一点,我们可以输入jobs,然后看一下他们的索引值。然后fg启动他们。

我们也可以给他们发送SIGCONT信号,让他们启动起来。不过这个时候,他们的只能在后台运行了。

这个时候,就可以看到他们的状态从T变成了S,从停止变成了运行状态。

最新文章

  1. 解决ntp的错误:no server can be used,exiting
  2. Programming Entity Framework 翻译(1)-目录
  3. C++primer学习笔记(二)&mdash;&mdash;Chapter 4
  4. CALayer的使用
  5. 使用Aspose.Cell控件实现Excel高难度报表的生成(二)
  6. IP地址验证
  7. 【Java基础】Java面试题目整理与解说(二)
  8. div宽度设置无效问题解决
  9. php 购物车完整实现代码
  10. -_-#【Backbone】View
  11. highcharts dynamic change line color
  12. 上篇:python的基本数据类型以及对应的常用方法(数字、字符串、布尔值)
  13. JMeter&#160;java.net.SocketException:Operationnotsupported:connect解决方案
  14. open jdk
  15. uva 10600 ACM Contest And Blackout
  16. js删除数组中元素的方法
  17. iOS-程序启动原理和UIApplication(转载)
  18. linux(CentOS)安装phpstorm
  19. uwsgi相关问题
  20. hdu 1266 Reverse Number

热门文章

  1. luogu4151 最大XOR和路径
  2. 高仿JDK动态代理 底层源码实现
  3. Oracle 11g服务OracleDBConsoleorcl启动失败(异常或报错)
  4. SprimgMVC学习笔记(五)—— Controller方法返回值
  5. java 柱状图、折线图、饼状图
  6. C++_了解虚函数的概念
  7. Folyd算法(转+适合问题 )
  8. [转载]jQuery中的html,val,text区别
  9. logback日志简记
  10. win10重装完登录不了微软账号