web-dev-qa-db-ja.com

フォークの子供を殺す方法?

子フォークを作成する次のコードがあります。そして、私は子供が親でその実行を完了する前に子供を殺したいと思います。どうやってするの?

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

}
13
MOHAMED

シグナルを送信します。

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

kill(pid, SIGKILL);

/* or */

kill(pid, SIGTERM);

2番目の形式は、信号を自分で処理する場合に特に適しています。

11
md5

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秒を与えます

11
Ed Heal

親の外からkill(pid, SIGKILL)を発行します。

4
alk