在 C 中不打印 'Killed' 就杀死进程树

Kill process tree without printing 'Killed' in C

我试图在 C 中终止整个进程树。我能够做到这一点,但是当我 运行 代码时,它会打印 "Killed"。我不想要这个。有什么方法可以在不打印 "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 行。

注意:在实际代码中,child进程将与另一个进程execve。将有多个 child 过程。因为他们自己可以有children,做kill(pid, SIGKILL)是行不通的。

根据 the kill manual pagepid 值小于 -1(您将通过)意味着

If pid is less than -1, then sig is sent to every process in the process group whose ID is -pid.

也就是说,您将终止 parent 进程(并且会产生消息),因为您通过了 -getpid(),但您不会终止任何其他 child 进程。

如果您想终止特定进程,请将其确切的进程 ID(在您的情况下为 pid)传递给 kill 调用。

如果要kill所有child进程那么需要创建一个进程组,这样所有child人都成为它的一员,并kill进程组中的所有进程(通过传递 pid 0)。请注意,这也会调用 parent 进程。

如果你想杀死 child 进程,而不是 parent 进程,创建一个 proxy-process 来创建一个新的进程组,并让这个 proxy-process创建 child 个进程。然后杀掉proxy-process进程组。

无论如何,解决你的问题的方法是不是杀死parent进程,而是让它正常退出。

我怀疑是shell(bashsh)打印的,根据前台进程终止的情况,让你知道你的进程发生了什么我们只是在互动。

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

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

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>`