【发布时间】:2012-11-30 17:41:16
【问题描述】:
我有一个简单的 C 程序,它分叉一个进程并调用 exec 来运行如下命令:
#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(此处为1429)发送到子进程时,我注意到子进程终止但不是执行sleep 400 的进程(pid 1430 )。换句话说,执行sleep 400 的进程在完成之前会变成僵尸。
如何发送终止信号,以便将信号传播到子进程中派生的进程?我尝试将kill 中的进程组ID 用作kill(-1*pid, SIGTERM),但无济于事。
【问题讨论】: