目录

1. SIGINT

2. SIGKILL

3. SIGSTOP与SIGCONT


简介

Signal Standard Action Comment
SIGINT P1990 Term Interrupt form keybord
SIGKILL P1990 Term Kill signal
SIGSTOP P1990 Term Interrupt form keybord

1. SIGINT

我们在shell交互式进程中常用的ctrl + c 就是对当前运行的程序进行终止。当前命令可以通过signal函数进行自定义处理函数。

signal的函数原型:

/* Set the handler for the signal SIG to HANDLER, returning the old
   handler, or SIG_ERR on error.*/
__sighandler_t signal (int __sig, __sighandler_t __handler);

下面我们来看一下如何自定义信号处理函数

/*================================================================
*   Copyright (C) 2022 baichao All rights reserved.
*
*   文件名称:sigint.cpp
*   创 建 者:baichao
*   创建日期:2022年12月12日
*   描    述:
*
================================================================*/

#include <iostream>
#include <signal.h>
#include <unistd.h>

/**
 * 处理SIGINT信号
 **/
void sigintHandler(int signal)
{
    std::cout << "signalHandler get signlal " << signal << std::endl;
}

int main(int argc, char *argv[])
{

    /**
     * ctrl + c
     **/
    signal(SIGINT, sigintHandler);

    while (true)
    {
        sleep(1);
    }
}

运行结果: 

在终端进程运行时执行"ctrl + c"命令失效,因为ctrl + c 就是kill -2 pid,但是当前SIGINT信号的处理函数在当前进程中被自定义了,不再使用默认的"Interrupt"策略。

2. SIGKILL

我们最常用的kill -9也就是kill -SIGKILL。当前SIGKILL不能像上面的SIGINT那样在进程中自定义信号处理函数,这样无法自定义的还有下面的SIGSTOP。

/*================================================================
*   Copyright (C) 2022 baichao All rights reserved.
*
*   文件名称:sigkill.cpp
*   创 建 者:baichao
*   创建日期:2022年12月12日
*   描    述:
*
================================================================*/

#include <iostream>
#include <signal.h>
#include <unistd.h>

/**
 * 处理SIGKILL信号
 **/
void sigkillHandler(int signal)
{
    std::cout << "sigkillHandler get signlal " << signal << std::endl;
}

int main(int argc, char *argv[])
{

    /**
     * kill -9
     **/
    signal(SIGKILL, sigkillHandler);

    while (true)
    {
        sleep(1);
    }
}

运行结果:

 证实了SIGKILL确实没法自定义处理函数。

3. SIGSTOP与SIGCONT

/*================================================================
*   Copyright (C) 2022 baichao All rights reserved.
*
*   文件名称:sigstop.cpp
*   创 建 者:baichao
*   创建日期:2022年12月13日
*   描    述:
*
================================================================*/

#include <iostream>
#include <signal.h>
#include <unistd.h>

/**
 * 处理SIGSTOP信号
 **/
void sigstopHandler(int signal)
{
    std::cout << "sigstopHandler get signlal " << signal << std::endl;
}

int main(int argc, char *argv[])
{

    /**
     * kill -9
     **/
    signal(SIGSTOP, sigstopHandler);

    while (true)
    {
        sleep(1);
    }
}

运行结果:

我们可以看到: SIGSTOP信号不能在进程中自定义处理函数;

进程收到SIGSTOP信号后,会进入T (TASK_STOPPED or TASK_TRACED),挂起状态或跟踪状态。

如果要使得被挂起的进程重新运行,使用SIGCONT信号触发。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐