杀死流程树而不在C

时间:2018-03-03 22:41:57

标签: c unix process sigkill

我正在尝试用C杀死整个进程树。我能够这样做,但是当我运行代码时,它会打印出“Killed”。我不想要这个。有没有办法可以在不打印“杀死”的情况下达到相同的效果?

这是我正在使用的代码:

#define _POSIX_SOURCE

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

#include <unistd.h>
#include <sys/wait.h>

int main() {
    int pid = fork();
    if (pid == 0) {
        sleep(2);
        printf("child printf\n");
    } else {
        sleep(1);
        kill(-getpid(), SIGKILL);
    }

    return EXIT_SUCCESS;
}

我正在使用gcc -std=c99 -Wall test.c进行编译。当我运行./a.out时,这是输出:

Killed

如果我将sleep(1)更改为sleep(3),则输出结果为:

child printf
Killed

在这两种情况下,我都希望删除Killed行。

注意:在实际代码中,子进程与另一个进程execve。将有多个儿童过程。因为他们可以自己生孩子,所以kill(pid, SIGKILL)无效。

4 个答案:

答案 0 :(得分:2)

根据the kill manual pagestack build --ghc-options='-j +RTS -s -RTS' 值小于pid(您将通过)意味着

  

如果-1小于pid,则-1会发送到ID为sig的流程组中的每个流程。

也就是说,你将杀死进程(并且会生成消息),因为你传递-pid,但你不会杀死任何其他子进程。

如果您要杀死特定进程,请将其确切的进程ID(在您的情况下为-getpid())传递给pid来电。

如果要杀死所有子进程,则需要创建进程组,以便所有子进程成为进程组的成员,并终止进程组中的所有进程(通过传递pid kill)。请注意,这也将调用父进程。

如果要终止子进程而不是父进程,请创建一个创建新进程组的代理进程,并让此代理进程创建子进程。然后终止代理进程进程组。

无论如何,你的问题的解决方案是杀死父进程,但让它正常退出。

答案 1 :(得分:1)

我怀疑它是打印出来的shell(bashsh),根据前台进程终止的情况,让你知道你刚刚过程发生了什么与...互动。

抑制它的一种方法就是做command | cat

答案 2 :(得分:0)

更好地将execl("yourcommandhere");> /dev/null 2>&1

一起使用

答案 3 :(得分:0)

用C编程:

/* Kill process without printing 'Killed' or 'Terminated' message. */
kill(pid, SIGQUIT);

kill(pid, SIGINT);

execl("/bin/bash", "bash", "-c", "kill -SIGQUIT `pidof <your command>` >/dev/null 2>&1", (char *)NULL);

execl("/bin/bash", "bash", "-c", "kill -SIGINT `pidof <your command>` >/dev/null 2>&1", (char *)NULL);

通过kill命令:

$ kill -SIGQUIT `pidof <your command>` >/dev/null 2>&1

$ kill -SIGINT `pidof <your command>`