linux信号:SIGINT、SIGKILL、SIGSTOP、SIGCONT

本文介绍了几种常见的信号处理方式,包括SIGINT、SIGKILL、SIGSTOP与SIGCONT,并通过示例代码展示了如何自定义SIGINT信号处理函数,以及解释了为何SIGKILL和SIGSTOP无法自定义处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

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信号触发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值