杀死进程树而不在C中打印'Killed'
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杀死进程树而不在C中打印'Killed'相关的知识,希望对你有一定的参考价值。
我试图在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
");
} 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)
是行不通的。
根据the kill
manual page,pid
值小于-1
(你将通过)意味着
如果
pid
小于-1
,那么sig
将被发送到ID为-pid
的进程组中的每个进程。
也就是说,你将杀死父进程(并且会生成消息),因为你传递-getpid()
,但你不会杀死任何其他子进程。
如果要杀死特定进程,请将其精确进程ID(在您的情况下为pid
)传递给kill
调用。
如果要杀死所有子进程,则需要创建进程组,以便所有子进程成为其成员,并终止进程组中的所有进程(通过传递pid 0
)。请注意,这也将调用父进程。
如果要终止子进程而不是父进程,请创建一个创建新进程组的代理进程,并让此代理进程创建子进程。然后终止代理进程进程组。
无论如何,你的问题的解决方案是不杀死父进程,但让它正常退出。
我怀疑它是打印的shell(bash
或sh
),根据前景进程终止的情况,让你知道你正在与之交互的过程发生了什么。
抑制它的一种方法就是做command | cat
。
更好地使用execl("yourcommandhere");
与> /dev/null 2>&1
以上是关于杀死进程树而不在C中打印'Killed'的主要内容,如果未能解决你的问题,请参考以下文章