在 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 page,pid
值小于 -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(bash
或sh
)打印的,根据前台进程终止的情况,让你知道你的进程发生了什么我们只是在互动。
抑制它的一种方法是 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>`
我试图在 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 page,pid
值小于 -1
(您将通过)意味着
If
pid
is less than-1
, thensig
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(bash
或sh
)打印的,根据前台进程终止的情况,让你知道你的进程发生了什么我们只是在互动。
抑制它的一种方法是 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>`