在我的父进程中,我创建了一个执行系统的子进程(" find / -print")。 从父内部开始,当我尝试使用kill(childProcPID,SIGTERM)来杀死这个子进程时,它不会立即终止。 system命令继续在控制台上打印输出。
以下是示例代码:
int main(void) {
pid_t childProc = fork();
switch (childProc) {
case -1:
perror("fork() error");
exit(EXIT_FAILURE);
case 0:
system("find / -print");
printf("if I use kill(pid, SIGTERM) control doesnt reach here");
exit(EXIT_SUCCESS);
default:
;
int i = 500000;
//No a great way to put sleep
//but its just temp
while (i != 0) {
--i;
}
kill(childProc, SIGTERM);
break;
}
printf("Exit!!!!!!");
return EXIT_SUCCESS;
}
请让我知道我做错了什么,或者是杀死孩子的正确方法?
答案 0 :(得分:4)
system
函数本身会创建一个子进程来执行命令(然后阻塞直到该子进程终止)。您所做的就是杀死调用system
的子进程,但不会杀死system
生成的子进程。
答案 1 :(得分:2)
尝试设置会话ID并取消进程组(man 2 kill)
int main(void) {
pid_t childProc = fork();
switch (childProc) {
case -1:
perror("fork() error");
exit(EXIT_FAILURE);
case 0:
setsid();
system("find / -print" );
printf("if I use kill(pid, SIGTERM) control doesnt reach here");
exit(EXIT_SUCCESS);
default:
sleep(1);
kill(childProc*-1, SIGTERM);
break;
}
printf("Exit!!!!!!");
return EXIT_SUCCESS;
}
这或多或少的作品。需要注意的是,父母必须将孩子的时间交给setsid(),因此需要睡觉。
希望有所帮助。
答案 2 :(得分:1)
首先,您应该检查从kill()
返回的结果 - 如果您返回0,则操作成功。但是,如果你得到-1,请检查全局变量errno
以查看问题所在。
如果信号发送成功,您唯一能做的就是确保您发送了您想要的信号。正如@Till在评论中指出的那样,发送SIGKILL instead of SIGTERM将更有效,因为操作系统处理前者并且目标进程无法忽略它。
无论如何,要意识到与其他进程的交互通常是一个异步过程 - 无论你做什么,目标进程都可能在kill()
返回时终止。