信号集 SIGINT, SIGTERM, SIGKILL[亲测有效]

(33) 2023-03-27 12:53

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说信号集 SIGINT, SIGTERM, SIGKILL[亲测有效],希望能够帮助你!!!。
信号集 SIGINT, SIGTERM, SIGKILL[亲测有效]_https://bianchenghao6.com/blog__第1张

 

SIGINT:程序终止信号。当用户按下CRTL+C时通知前台进程组终止进程 或者 kill -2 <pid> 触发。

SIGTERM:程序结束信号, 可以使用 kill -15 <pid> 触发

SIGKILL:用来立即结束程序的运行。可以使用kill -9 <pid> 触发

SIGTERM和SIGKILL的区别:

SIGTERM信号是可以被捕获的,因此可以尝试block,或者忽视,但是SIGKILL不能。

下面写了一个简单的例子来佐证这个事情 sig_test.cpp:

#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>

void term_handler(int seg) {
    printf("sig term handler %d\n", seg);
}

void int_handler(int seg) {
    printf("sig int handler %d\n", seg);
}

void kill_handler(int seg) {
    printf("sig kill handler %d\n", seg);
}

int main() {
    sigset_t sigset;
    struct sigaction term_act;
    struct sigaction int_act;
    struct sigaction kill_act;

    sigemptyset(&sigset);
    sigaddset(&sigset, SIGINT);
    sigaddset(&sigset, SIGTERM);
    sigaddset(&sigset, SIGKILL);
    sigemptyset(&term_act.sa_mask);
    sigemptyset(&int_act.sa_mask);
    sigemptyset(&kill_act.sa_mask);

    term_act.sa_flags = 0;
    term_act.sa_handler = term_handler;
    int_act.sa_flags = 0;
    int_act.sa_handler = int_handler;
    kill_act.sa_flags = 0;
    kill_act.sa_handler = kill_handler;
    sigaction(SIGINT, &int_act, 0);
    sigaction(SIGTERM, &term_act, 0);
    sigaction(SIGKILL, &kill_act, 0);
 
    while(1);
    exit(0);
}

执行命令编译

g++ ./sig_test.cpp -o sig_test

运行 ./sig_test,结果如下

$ ./sig_test

^Csig int handler 2
sig term handler 15
[1]    46423 killed     ./sig_test



运行sig_test 后,进程号46423,
kill -2 46423 输出  ^Csig int handler 2
kill -15 46423, 输出 sig term handler 15
kill -9 46423, 输出 [1]    46423 killed     ./sig_test

 

附加:

终端执行,kill -l 可以查看还可以支持的信号,例如我的mac:

kill -l
HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2

通过,kill -l <名称>可以查看 对应的数字,例如查看 INT的数字

$ kill -l INT       
2

所以可以通过 

kill -2 <pid> // 模拟INT信号

或者更干脆直接用kill定义的枚举,例如

kill -INT <pid>

 

上一篇

已是最后文章

下一篇

已是最新文章

发表回复