杀死进程树而不在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 pagepid值小于-1(你将通过)意味着

如果pid小于-1,那么sig将被发送到ID为-pid的进程组中的每个进程。

也就是说,你将杀死父进程(并且会生成消息),因为你传递-getpid(),但你不会杀死任何其他子进程。

如果要杀死特定进程,请将其精确进程ID(在您的情况下为pid)传递给kill调用。

如果要杀死所有子进程,则需要创建进程组,以便所有子进程成为其成员,并终止进程组中的所有进程(通过传递pid 0)。请注意,这也将调用父进程。

如果要终止子进程而不是父进程,请创建一个创建新进程组的代理进程,并让此代理进程创建子进程。然后终止代理进程进程组。

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

另一答案

我怀疑它是打印的shell(bashsh),根据前景进程终止的情况,让你知道你正在与之交互的过程发生了什么。

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

另一答案

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

以上是关于杀死进程树而不在C中打印'Killed'的主要内容,如果未能解决你的问题,请参考以下文章

如何杀死oracle死锁进程

杀死进程的脚本k.sh

使用Shell脚本查找程序对应的进程ID,并杀死进程

如何防止 Spring Boot / Tomcat (Java8) 进程被 OOM 杀死?

点安装 - 杀死

kill啥意思