我正在尝试在基于Unix的操作系统上实现类似
当我在没有
请问有人可以告诉我如何在我的
timeout
命令的功能,代码如下:
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
example
程序运行了几秒钟并分叉出几个进程。当计时器在timeout
时到期,只有example
的父进程被杀死,而其子进程继续在控制台上打印。当我在没有
timeout
的情况下运行example
并按下Ctrl+C
时,父进程和所有子进程都能够成功被杀死。请问有人可以告诉我如何在我的
timeout
程序中解决这个问题吗?
setsid
。 - kuroi nekosetsid
,然后再执行execv
,那么当定时器到期时,父进程如何向新的进程组或者fork出来的进程发送信号呢? - moorara