是否存在任何不受SIGTERM影响的流程?

时间:2017-11-21 15:55:20

标签: c linux shell signals

我有一个在C中编写shell代码的任务。其中一个shell命令是" quit kill"我必须在关闭主进程之前向所有子进程发送TERM信号。 如果子进程没有关闭5秒,我必须发送一个KILL信号来杀死它。 现在我已经编写了代码,我想测试它,我不知道怎么样,那么你们有没有想到一个忽略TERM信号的过程? 这是我为终止一个子进程而编写的代码:

            kill(pid,SIGTERM);
            t = time(NULL);
            while(1){
                int state = waitpid(pid,&status,WNOHANG);
                if(state<0){
                    perror("Error ");
                    exit(0);
                }
                if(state == 0){
                    if((time(NULL)-t)>5){
                        printf("(5 sec passed) Sending SIGKILL… Done.\n");
                        kill(pid,SIGKILL);
                        break;
                    }
                }
                else{
                    printf("Done.\n");
                    break;
                }
            }

2 个答案:

答案 0 :(得分:4)

此bash脚本忽略了TERM:

#!/bin/bash
trap '' TERM
cat

将其放入文件并启动。然后尝试用TERM杀死它。

答案 1 :(得分:3)

添加必要的包含

#include <signal.h>

声明一个不执行任何操作的函数,例如

void nothing(int x) {
    // nothing
}

在&#34;受保护&#34;的开头添加流程代码

signal(SIGTERM, nothing);

(您也可以在不使用signal(SIGTERM, SIG_IGN);功能的情况下执行nothing() - 来自@rici评论)

然后,该进程将捕获主代码发送的TERM信号,并执行不执行任何操作的函数nothing()

signal man page