如何终止 fork 的子进程?

21

我有以下代码,它创建一个子进程。我想在父进程中让子进程在完成执行之前被终止。怎么做?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int i;

main (int ac, char **av)
{
  int pid;

  i = 1;

  if ((pid = fork()) == 0) {
    /* child */
    while (1) {
      printf ("I m child\n");
      sleep (1);
    }
  }
  else {
    /* Error */
    perror ("fork");
    exit (1);
  }
  sleep (10)

   // TODO here: how to add code to kill child??

}

3
fork() 函数返回的是 pid_t 类型而不是 int 类型,因此你应该声明与之对应的变量类型。 - Niklas B.
5
很高兴这个问题的标题不需要进一步澄清。提醒任何婴儿杀手,这是“用叉子”而不是“拿着叉子”。 - Mike Poole
4
@MikePoole:谷歌搜索结果与我的搜索词非常接近,但是我仍然找不到想要的信息。 - Mike G
1
@MikePoole #分叉也重要 - flarn2006
4
模因带我来到这里。 - Abhishek Choudhary
显示剩余2条评论
3个回答

16

kill系统调用。通常最好先使用SIGTERM,给进程一个机会优雅地退出,然后再使用SIGKILL。

编辑

忘记了您需要使用waitpid获取该进程的返回状态并防止僵尸进程。

另一个编辑

您可以使用以下代码:

kill(pid, SIGTERM);

bool died = false;
for (int loop; !died && loop < 5 /*For example */; ++loop)
{
    int status;
    pid_t id;
    sleep(1);
    if (waitpid(pid, &status, WNOHANG) == pid) died = true;
}

if (!died) kill(pid, SIGKILL);

它将给进程5秒钟优雅地退出的时间


14

发送信号。

#include <sys/types.h>
#include <signal.h>

kill(pid, SIGKILL);

/* or */

kill(pid, SIGTERM);

如果您自己处理信号,第二种形式是更可取的。


5
或者更礼貌地说,使用SIGTERM :) - Niklas B.
3
为什么每个人都坚持使用SIGKILL信号? - Brian Agnew
@Niklas B.:在这里使用SIGTERM有什么优势吗?就我所看到的,他没有任何处理程序。 - md5
2
@Kirilenko - 人们认为这个Noddy示例只是为了获得理解。在现实世界中,子进程会比这更复杂。 - Ed Heal

5

从父进程外部执行 kill(pid, SIGKILL) 命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接