我正在尝试实施一个timeout
类似命令unix
基于操作系统如下:
int pid;
timer_t timer_id;
struct sigevent timer_event;
struct itimerspec timer_value;
void timeout_signal_handler(int sig_no)
{
kill(pid, SIGKILL);
}
int create_timer() { /* implementation */ }
int start_timer_oneshot(int interval_ms) { /* implementation */ }
int main(int argc, char* argv[])
{
int status, pid_return;
void *signal_return;
if (argc < 2)
return EXIT_FAILURE;
signal_return = signal(SIGUSR1, timeout_signal_handler);
if (signal_return == SIG_ERR)
return EXIT_FAILURE;
create_timer();
start_timer_oneshot(TIMEOUT);
if ((pid = fork()) == 0)
{
execv(argv[1], &argv[1]);
return EXIT_FAILURE;
}
else
{
status = -1;
while (status == -1)
status = wait(&pid_return);
}
return EXIT_SUCCESS;
}
我按如下方式使用该实用程序:
./timeout example
The example
程序运行几秒钟并分叉几个进程。当定时器到期时timeout
,只有父进程example
被杀死,它的孩子继续在控制台上打印。
当我运行example
没有timeout
,然后按Ctrl+C
,父母及其所有孩子都被成功杀死。
谁能告诉我如何解决这个问题timeout
程序?
你想打电话kill()
on pid 0
。这会将信号发送到调用进程的进程组的所有成员。
然而,这仅在该过程已被执行时才有效fork()
/exec*()
'ed(或其子进程)不会自行更改其(他们的)进程组。
From man 2 kill:
如果 pid 为 0,则 sig 应发送到进程组 ID 等于发送者的进程组 ID 的所有进程(不包括一组未指定的系统进程),并且该进程的进程组 ID 等于发送者的进程组 ID。
有权发送信号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)