zoukankan      html  css  js  c++  java
  • 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
    ",signo,getpid());
    }
    
    void cleanup(){
        printf("cleanup,pid:%d
    ",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
    ",getpid());
            while(1){
                sleep(1);
            }
        }else{
            printf("parent pid:%d
    ",getpid());
            while(1){
                sleep(1);
            }
        }
        return 0;
    }

    SIGKILL比较简单,我们就不再验证了。先验证一下SIGINT。

    sigint

    可以看到输入ctrl+c的时候,父子进程都收到相关的信号。但是我输入kill -2 742的时候,只有父进程收到了,不会传给子进程。 

    下面我们验证SIGQUIT产生core。

    sigquit

    可能部分的机器默认是不产生,我们需要输入几个命令。


    #设置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启动他们。


    sigtstp

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


    sigcton

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

  • 相关阅读:
    反序列化
    反序列化使用
    Serializer序列器
    DRF工程搭建
    JDK目录介绍
    Java环境变量配置
    Java语言的特性
    Java语言概述
    计算机编程语言介绍
    软件开发介绍
  • 原文地址:https://www.cnblogs.com/HPhone/p/4511319.html
Copyright © 2011-2022 走看看