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