如何杀死叉子?

MOH*_*MED 9 c fork

我有以下代码创建一个子for​​k.我想在孩子完成执行之前杀死孩子.怎么做?

#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??

}
Run Code Online (Sandbox Code Playgroud)

md5*_*md5 10

发送信号.

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

kill(pid, SIGKILL);

/* or */

kill(pid, SIGTERM);
Run Code Online (Sandbox Code Playgroud)

第二种形式更可取,尤其是如果您自己处理信号.

  • 或者`SIGTERM`,如果你想更礼貌:) (5认同)
  • 为什么每个人都坚持使用SIGKILL? (2认同)
  • @Kirilenko - One假设这个Noddy的例子只是为了获得理解.在现实世界中,子过程会比这更复杂. (2认同)

Ed *_*eal 10

请参阅kill system call.在使用SIGKILL之前,通常首先使用SIGTERM为进程提供一个感恩的机会.

编辑

忘了你需要使用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);
Run Code Online (Sandbox Code Playgroud)

它将使该过程优雅地死亡5秒


alk*_*alk 5

发出kill(pid, SIGKILL)从走出父。