根据下一行代码中waitpid()的输出,任何人都可以解释为什么子进程是活动的吗?我一直坚持这个。
int main(){
int p;
if (!(p = fork())){sleep(10);
return;}
int s;
sleep(1);
printf("%d \n", waitpid(p,&s, WNOHANG|WUNTRACED));
kill(p,2);
return 0;
}
提前感谢!
答案 0 :(得分:0)
评论变成了扩展信息的答案。
您的return;
语句应为return 0;
,并且您的编译器应该抱怨在返回值的函数中没有值的返回。
为什么要写出扭曲的C? if ((p = fork()) == 0)
作为一个条件有什么问题? (不是每个人都会同意我的意见,但是你得到我的评论,如果他们选择这样做,其他人可以有不同的评论。)
如果s
报告成功,您应该错误检查您的系统调用并打印显着信息(如PID,以及waitpid()
之后的{,1}}中的值,并检查也是waitpid()
。请注意kill()
返回并不能告诉你除了孩子是否已经死亡(它不会成功)之外的其他因素。睡眠之间存在差异(没有死,程序可能会再次醒来 - 除非它被杀死)并且已经死亡(没有机会再次醒来)。waitpid()
函数仅报告死亡的孩子(或未经抚养/停止的孩子 - 这里不是问题),而不是那些仍然活着的孩子,即使他们只是睡着了,等待信号。
您的意思是“儿童流程是否有效”&#39 ;?它睡了10秒钟。你的父母代码睡了1秒钟,waitpid()
会立即返回,通常报告没有死孩子(因为孩子还没有睡觉),然后你打断了孩子(为什么是waitpid()
未写2
?)。
SIGINT
返回0,我期待它返回子进程的PID。这是我不明白的。如果子进程被挂起,为什么waitpid()返回0而不是子进程的PID?
waitpid()
规范说:
返回值
如果由于子进程的状态可用而返回
waitpid()
或wait()
,则这些函数将返回一个值,该值等于报告其状态的子进程的进程ID。如果waitpid()
或wait()
由于向调用进程发送信号而返回,则返回-1并将waitpid()
设置为[EINTR]。 如果errno
中设置的WNOHANG调用waitpid()
,则options
至少有一个子进程,其状态不可用,并且状态不适用于任何进程由pid
指定,返回0。否则,将返回-1,并设置pid
以指示错误。
重点增加
您所看到的正是根据规格。孩子还没有死,所以你不能获得一个状态,但是因为你使用errno
,你得到0并立即返回,而不是等到孩子退出。