睡眠后杀死进程

4

我无法让我的程序在使用kill(pid,SIGTERM)后休眠()。 我该怎么做?

我正在使用的代码:

kill(PID_of_Process_to_be_killed,SIGTERM);
sleep(5); --> this is not working
sleep(5); --> this is working

目前的解决方案是:

kill(PID_of_Process_to_be_killed,SIGTERM);
sleep(sleep(5));

但为什么 kill 后第一次 sleep 返回 0 呢?
2个回答

6

由于接收到信号,您的sleep()调用可能会提前终止。请检查返回值。如果是正数,则可能希望再次使用该值进行sleep()。来自http://www.manpagez.com/man/3/Sleep/:

如果sleep()函数返回,因为已经过了请求的时间, 则返回的值将为零。如果sleep()函数由于接收到信号而返回,则返回的值将是未休眠的时间(请求的时间减去实际休眠的时间)以秒为单位


1
在这种情况下,信号可能是SIGCHLD(尽管我认为它会打断问题中的第一个睡眠)。不过也可能是其他任何信号。 - Steve Jessop

3

如果不处理信号,SIGTERM就是致命的。

如果是其他进程或线程发送信号,sleep会返回EINTR。

如果你使用标准库而不是直接系统调用(你可能正在使用),sleep会返回-1并且errno = EINTR。


由于某种原因,在使用原始处理程序发送SIGTERM的kill之后,我无法使用sleep函数。之前我成功使用了它但在kill后不行。 你知道为什么会发生这种情况吗?kill(PID_of_Process_to_be_killed,SIGTERM); sleep(5); --> 这个不起作用 sleep(5); --> 这个可以正常工作 - Ran S
ERRNO 包含什么信息?sleep 函数返回什么? - Joshua
第一个 sleep 返回 5,意味着它什么也没做。 第二个 sleep(5) 返回 0,意味着它睡了 5 秒。"errno = EINTER"目前我正在使用这个 sleep(sleep(5)),但我不认为这是正确的解决方案... - Ran S
如果一切都通过信号处理,则正确的解决方案是:x = 5; do { x = sleep(x); } while (x > 0); - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接