【问题标题】:are there any processes that are not affected by SIGTERM?是否有不受 SIGTERM 影响的进程?
【发布时间】:2018-05-05 03:55:36
【问题描述】:

我有一个任务是用 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;
                }
            }

【问题讨论】:

    标签: c linux shell signals


    【解决方案1】:

    此 bash 脚本忽略 TERM:

    #!/bin/bash
    trap '' TERM
    cat
    

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

    【讨论】:

      【解决方案2】:

      添加必要的包含

      #include <signal.h>
      

      例如声明一个什么都不做的函数

      void nothing(int x) {
          // nothing
      }
      

      在“受保护”进程代码的开头添加

      signal(SIGTERM, nothing);
      

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

      然后,该进程将捕获您的主代码发送的 TERM 信号,并执行函数 nothing() 什么都不做。

      signal man page。

      【讨论】:

      • 你可以使用SIG_IGN(参见同一个手册页)。而且您不能在信号处理程序中使用printf,请参阅man7.org/linux/man-pages/man7/signal-safety.7.html
      • @Raeedmndow 如果您认为答案对您最有帮助,您可以将答案标记为已接受。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2017-08-17
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多