gpt4 book ai didi

c - 杀死进程树而不在 C 中打印 'Killed'

转载 作者:太空宇宙 更新时间:2023-11-04 06:52:36 26 4
gpt4 key购买 nike

我正试图在 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 行。

注意:在实际代码中,子进程将与另一个一起execve。将有多个子进程。因为他们自己可以生 child ,所以执行 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.

也就是说,由于您传递了 -getpid(),您将杀死 parent 进程(并将产生消息),但您不会杀死任何其他子进程过程。

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

如果你想杀死所有的子进程那么你需要创建一个进程组,所以所有的 child 都成为它的一员,并杀死进程组中的所有进程(通过传递pid 0 ).请注意,这也会调用父进程。

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

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

关于c - 杀死进程树而不在 C 中打印 'Killed',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49090008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com