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

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

一、关闭进程信号

常见的4中关闭进程信号是SIGKILL,SIGINT,SIGTERM,SIGQUIT. SIGKILL,就是为了关闭进程用的,无法捕获以及忽略.场景是,管理员把一些占用资源的进程或者无法掌控的孤儿进程杀死. SIGINT,interrupt中断)进程,这个是可以捕获以及忽略。可以使用ctrl+c发出信号,直接发给父进程以及子进程,这样的话就可以把这个程序所有的进程都可以关闭掉。 SIGTERM,terminate终止)进程,这个也是可以捕获以及忽略的。和SIGINT相比,就是没有相应的键盘控制命令。如果要去关闭所有的进程的话,只能挨个的发给所有的进程。 SIGQUIT,quit退出)进程,这个也是可以捕获以及忽略的。可以使用ctrl+发出信号,直接发给父进程以及子进程。如果是不捕获的话,他就会产生core文件。

image

键盘快捷键最大的好处就是发给所有的进程。

最下面我们用程序来验证一下。

第一组 关闭进程信号 程序验证 

先上代码。

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <signal.h>

void processint signo){

    printf”signo:%d,pid:%d
“,signo,getpid));

}

void cleanup){

    printf”cleanup,pid:%d
“,getpid));

}

int main)

{

    pid_t pid;

    atexitcleanup);

    signalSIGINT, process);

    signalSIGTERM, process);

    //signalSIGQUIT, process);

    if pid = fork)) == 0 )

    {

        printf”child pid:%d
“,getpid));

        while1){

            sleep1);

        }

    }else{

        printf”parent pid:%d
“,getpid));

        while1){

            sleep1);

        }

    }

    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

 

二、停止信号

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

SIGSTOP,程序挂起,没有相应的快捷键,不能被捕获以及忽略。

SIGTSTP,程序挂起,快捷键ctrl+z,可以被捕获以及忽略。

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

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

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

 

参考链接:http://www.linuxidc.com/Linux/2015-05/117695.htm

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注