【发布时间】:2017-11-15 12:24:15
【问题描述】:
您好,我正在使用 3 个进程 P0、P1、P2 制作程序 我想做一个像下面这样的循环
init: P0 P1,P2 paused, signal to P0
P0 : wake up by signal -> finish job -> signal to P3 -> pause
P1 : wake up by signal -> finish job -> signal to P2 -> pause
P2 : wake up by signal -> finish job -> signal to P3 -> pause
repeat 0~2
不幸的是,SOMETIMES 信号在目标进程睡眠之前出现
所以我想检查目标进程是否暂停。 我像这样插入[检查代码]
//end job here here
//
int status = 0;
do {
waitpid(target_pid, &status, WNOHANG); // WNOHANG : check child status without waiting
} while ( ! WIFSTOPPED(status)); // linux man said that WIFSTOPPED
// return true if process stopped
//signal to target_pid and pause() here
但它不起作用。
如果我使用
while( ! WIFSTOPPED(status))
程序 100% 不能跳出循环。
如果我使用
while( WIFSTOPPED(status))
它的工作方式与我输入[检查代码]之前相同
我知道waitpid函数是用来检查进程结束的。
但不能 waitpid() 仅用于检查是否已暂停?
【问题讨论】:
-
这个作业的第三个实例:(
-
这不是它的工作原理。我推荐你read the
waitpidmanual page 并检查它返回。 -
你的意思是 WIFSTOPPED() 的“检查停止”和我说的不一样?
-
您认为停止进程意味着什么?您不完整的程序片段并没有给我们太多线索,但您应该知道
pause()和sleep()都与它无关。 “已停止”的意思是“暂停”。 -
waitpid()(当不与ptraced 进程一起使用时)需要WUNTRACED才能接收WIFSTOPPED通知。