【发布时间】:2011-09-23 23:56:10
【问题描述】:
我使用fork() 创建了一个子进程。如果子进程无法在 30 秒内完成执行,父进程如何杀死子进程?我想让子进程最多执行 30 秒。如果超过 30 秒,父进程将杀死它。你有什么想法吗?
【问题讨论】:
我使用fork() 创建了一个子进程。如果子进程无法在 30 秒内完成执行,父进程如何杀死子进程?我想让子进程最多执行 30 秒。如果超过 30 秒,父进程将杀死它。你有什么想法吗?
【问题讨论】:
向它发送 SIGTERM 或 SIGKILL:
http://en.wikipedia.org/wiki/SIGKILL
http://en.wikipedia.org/wiki/SIGTERM
SIGTERM 是礼貌的,它让进程在运行之前进行清理,而 SIGKILL 用于当它不听的时候>:)
shell 示例(手册页:http://unixhelp.ed.ac.uk/CGI/man-cgi?kill)
杀死 -9 pid
在 C 中,您可以使用 kill 系统调用来做同样的事情:
kill(pid, SIGKILL);
请参阅以下手册页:http://linux.die.net/man/2/kill
【讨论】:
在父进程中,fork()的返回值是子进程的进程ID。当您需要终止子进程时,将该值放在某个地方。 fork() 在子进程中返回零(0)。
当你需要终止子进程时,使用 kill(2) 函数和 fork() 返回的进程 ID,以及你希望传递的信号(例如 SIGTERM)。
记得在子进程上调用 wait() 以防止任何逗留的僵尸。
【讨论】:
试试这样的:
#include <signal.h>
pid_t child_pid = -1 ; //Global
void kill_child(int sig)
{
kill(child_pid,SIGKILL);
}
int main(int argc, char *argv[])
{
signal(SIGALRM,(void (*)(int))kill_child);
child_pid = fork();
if (child_pid > 0) {
/*PARENT*/
alarm(30);
/*
* Do parent's tasks here.
*/
wait(NULL);
}
else if (child_pid == 0){
/*CHILD*/
/*
* Do child's tasks here.
*/
}
}
【讨论】:
alarm(0))?