Linux 两组信号对比

博客逐步迁移到,独立博客,原文地址 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,从停止变成了运行状态。

时间: 2024-10-11 10:35:26

Linux 两组信号对比的相关文章

Linux 两组信号对比(关闭和停止进程信号)

之前看信号的时候,没有太注意不同信号的对比.今天再次看到的时候,突然感觉对一些信号,非常相似,乃至非常容易混淆.今天周末就抽空总结一下. 一.关闭进程信号 常见的4中关闭进程信号是SIGKILL,SIGINT,SIGTERM,SIGQUIT. SIGKILL,就是为了关闭进程用的,无法捕获以及忽略.场景是,管理员把一些占用资源的进程或者无法掌控的孤儿进程杀死. SIGINT,interrupt(中断)进程,这个是可以捕获以及忽略.可以使用ctrl+c发出信号,直接发给父进程以及子进程,这样的话就

echart两组柱状图对比时,不同类型根据各类型的最大值为基准进行展示

项目中遇到的问题:因为数据太小,箭头的地方展示不出来,这时的两组对比数据是根据一个最大值为基准进行渲染的.但我们想实现不同类型的对比根据不同的基准值渲染. 理想效果如下图: 实现代码: option = { grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true }, xAxis: { type: 'log',//这是重点 }, yAxis: { type: 'category', data: ['巴西','印尼','美

浅谈Linux中的信号机制(二)

首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理了1

Linux 中常见信号介绍

http://blog.csdn.net/eager7/article/details/8290937 我们运行如下命令,可看到Linux支持的信号列表: $ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTER

浅析Linux中的信号机制(一)

有好些日子没有写博客了,自己想想还是不要荒废了时间,写点儿东西记录自己的成长还是百利无一害的.今天是9月17号,暑假在某家游戏公司实习了一段时间,做的事情是在Windows上用c++写一些游戏英雄技能的逻辑实现.虽然时间不算长,但是也算学了一点东西,对团队项目开发流程也有了一个直观的感受,项目里c++11新特性也有用到不少,特别是lambda表达式,STL的一些容器和算法也终于有了可以实践的地方.由于自己比较喜欢Linux C,也就没有做留下的打算,现在回到了学校,好好复习一段时间,准备一下校招

linux系统下信号具体解释2

信号是UNIX 系统所使用的进程通信方法中,最古老的一种.信号不但能从内核发往一个进程,也能从一个进程发往还有一个进程.比如,用户在后台启动了一个要运行较长时间的程序,假设想中断其运行,能够用kill 命令把SIGTERM信号发送给这个进程,SIGTERM 将终止此进程的运行.信号还提供了向UNIX 系统进程传送软中断的简单方法.信号能够中断一个进程,而无论它正在作什么工作.因为信号的特点,所以不用它来作进程间的直接数据传送,而把它用作对非正常情况的处理.因为信号本身不能直接携带信息,这就限制了

Linux下异常信号

我们介绍一些标准信号的名称以及它们代表的事件.每一个信号名称是一个代表正整数的宏,但是你不要试图去推测宏代表的具体数值,而是直接使用名称.这是因为这个数值会随不同的系统或同样系统的不同版本而不同,但是名称还算是标准化和统一的.    这些名称定义在signal.h中.    int NSIG是一个定义的宏,它描述了定义的信号的数量.由于信号的数值是从0开始连续分配的,所以,NSIG比系统中所定义的最大的信号数值大1. 11.2.1 程序出错信号    下面介绍的信号是有程序的错误造成的.这些严重

linux系统下信号详解2

信号是UNIX 系统所使用的进程通信方法中,最古老的一种.信号不但能从内核发往一个进程,也能从一个进程发往另一个进程.例如,用户在后台启动了一个要运行较长时间的程序,如果想中断其执行,可以用kill 命令把SIGTERM信号发送给这个进程,SIGTERM 将终止此进程的执行.信号还提供了向UNIX 系统进程传送软中断的简单方法.信号可以中断一个进程,而不管它正在作什么工作.由于信号的特点,所以不用它来作进程间的直接数据传送,而把它用作对非正常情况的处理.由于信号本身不能直接携带信息,这就限制了它

linux学习之信号

一.概述: 软中断信号(signal, 简称信号)是用来通知进程发生了异步事件.在软件层次上是对中断的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达.进程之间可以互相通过系统调用kill发送软中断信号.内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件.信号机制除了基本通知功能外,还可以传递附加信息. 收到信号的进程对各种信号的