1

プロセスをフォークし、execを呼び出して次のようなコマンドを実行する単純なCプログラムがあります。

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

int fork_process(int sleep_interval) {
   char cmd[30];

   pid_t pid = fork();       
   if (pid > 0) {
       return pid;
   }
   else if (pid < 0) {
        printf("At parent. Couldn't create a child process!\n");
        return pid;
   }
   else { 
        sprintf(cmd, "sleep %d; %s", sleep_interval, "gzip a > a.gz");
        execlp("sh", "sh", "-c", cmd, (char *) 0);
   }
}

int main () {
   pid_t pid = fork_process(400);

   sleep (10);
   kill(pid, SIGTERM);

   return 1;
}

このプログラムを実行するとsh、実行するプロセスが内部的にフォークされていることに気付きsleep 400ます。

$ps x
  1428 pts/80   S+     0:00 ./kill_prog
  1429 pts/80   S+      0:00 sh -c sleep 400; gzip a > a.gz
  1430 pts/80   S+      0:00 sleep 400

ここで、SIGTERMシグナルがプログラム内でpid(ここ)を介して子プロセスに送信されると、子プロセスは終了しますが、実行中のプロセス(pid )1429は終了しないことに気付きます。つまり、実行中のプロセスは、完了するまでゾンビになります。sleep 4001430sleep 400

子プロセス内でフォークされたプロセスにシグナルが伝播されるように、killシグナルを送信するにはどうすればよいですか?プロセスグループIDをそのまま使用してみkillましkill(-1*pid, SIGTERM)たが、役に立ちませんでした。

4

2 に答える 2

4

私はついに上記の問題の修正を考え出しました。それは2つの小さな変更の問題でした。

子をフォークした後、親でこれを行うように追加します。

pid_t pid = fork();   
if (pid > 0) {
   // Make child process the leader of its own process group. This allows
   // signals to also be delivered to processes forked by the child process.
   setpgid(childpid, 0); 
   return pid;
}

最後に、プロセス グループ全体にシグナルを送信します。

// Send signal to process group of child which is denoted by -ve value of child pid.
// This is done to ensure delivery of signal to processes forked within the child. 
kill((-1*pid), SIGTERM);
于 2012-12-14T16:24:01.953 に答える
0

本当に簡単です: SIGTERM シグナルハンドラをプロセスに追加するだけです:

于 2012-12-12T22:20:35.863 に答える