目录

1. SIGINT

2. SIGKILL

3. SIGSTOP与SIGCONT


简介

SignalStandardActionComment
SIGINTP1990TermInterrupt form keybord
SIGKILLP1990TermKill signal
SIGSTOPP1990TermInterrupt 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

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐