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