我正在尝试用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)
无效。
答案 0 :(得分:2)
根据the kill
manual page,stack build --ghc-options='-j +RTS -s -RTS'
值小于pid
(您将通过)意味着
如果
-1
小于pid
,则-1
会发送到ID为sig
的流程组中的每个流程。
也就是说,你将杀死父进程(并且会生成消息),因为你传递-pid
,但你不会杀死任何其他子进程。
如果您要杀死特定进程,请将其确切的进程ID(在您的情况下为-getpid()
)传递给pid
来电。
如果要杀死所有子进程,则需要创建进程组,以便所有子进程成为进程组的成员,并终止进程组中的所有进程(通过传递pid kill
)。请注意,这也将调用父进程。
如果要终止子进程而不是父进程,请创建一个创建新进程组的代理进程,并让此代理进程创建子进程。然后终止代理进程进程组。
无论如何,你的问题的解决方案是不杀死父进程,但让它正常退出。
答案 1 :(得分:1)
我怀疑它是打印出来的shell(bash
或sh
),根据前台进程终止的情况,让你知道你刚刚过程发生了什么与...互动。
抑制它的一种方法就是做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>`