22

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

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

}
4

3 に答える 3

16

システムコールの強制終了を参照してください。通常、最初に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秒を与えます

于 2012-11-07T16:25:01.073 に答える
14

信号を送信します。

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

kill(pid, SIGKILL);

/* or */

kill(pid, SIGTERM);

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

于 2012-11-07T16:24:01.190 に答える
5

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

于 2012-11-07T16:23:56.037 に答える