我想使用SIGTSTP(或SIGSTOP)暂停进程并稍后使用SIGCONT恢复进程。 SIGTSTP和SIGSTOP正如预期的那样工作,但SIGCONT有时不会唤醒已停止的进程。
例如: SIGCONT适用于find命令:
find /
kill -SIGSTOP $pid_of_the_find_proc
[1]+ Stopped find /
kill -SIGCONT $pid_of_the_find_proc
// find / woke up
但是当我用sleep命令测试它时,它就失败了。
sleep 100
kill -SIGSTOP $pid_of_the_sleep_proc
[1]+ Stopped sleep 100
kill -SIGCONT $pid_of_the_sleep_proc
// nothing happened after sending the SIGCONT signal
但是,bash的内置命令fg
可以很好地适应睡眠
sleep 100
kill -SIGSTOP $pid_of_the_sleep_proc
[1]+ Stopped sleep 100
kill -SIGCONT $pid_of_the_sleep_proc
fg 1
// the sleep process woke up after the fg command
所以我的问题是为什么kill -SIGCONT
不适用于睡眠,为什么fg
有效。顺便说一句,我在我的Ubuntu 13.10 x86-64 pc上运行这些测试。提前谢谢。
答案 0 :(得分:1)
你怎么知道发送SIGCONT不会唤醒睡眠过程?你期望发生什么? fg命令唤醒进程并将其带到前台(因此fg)。 bg命令唤醒进程并将其带到后台(因此为bg)。
在实现细节中,shell在前台使用wait进程,而不在后台使用wait进程。
因此,在SIGCONT之后,您的睡眠可能会继续在后台运行。您可以在发送SIGCONT后等待100秒,然后睡眠命令应该已经终止,您应该收到通知(立即或按下返回后,具体取决于您的shell的配置)。