【发布时间】:2015-03-02 14:10:38
【问题描述】:
根据下一行代码中 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;
}
提前致谢!
【问题讨论】:
-
为什么要写扭曲的C?
if ((p = fork()) == 0)作为条件有什么问题? (不是每个人都同意我的观点,但你从我那里得到我的 cmets,其他人可以发表不同的评论。)你的return;声明应该是return 0;并且你的编译器应该抱怨。 “子进程处于活动状态”是什么意思?它会休眠 10 秒。你的父母代码休眠 1 秒,执行一个通常会失败的waitpid()(因为孩子还没有完成睡眠),然后你打断了孩子(为什么 2 没有写成SIGINT?)。你在看什么;你在期待什么? -
您应该错误检查您的系统调用,并打印显着信息(如 PID,如果
waitpid()报告成功,则在waitpid()之后打印s中的值,并检查kill()请注意,waitpid()的返回除了孩子是否死了(它不会死)之外并没有告诉你太多。睡眠之间有区别(没有死,并且程序可能会再次醒来 - 除非它首先被杀死) 并且死了(没有机会再次醒来)。 -
waitpid() 返回 0,我期待它返回子进程的 PID。这是我不明白的。如果子进程被挂起,为什么waitpid()返回0而不是子进程的PID?
-
waitpid()规范说:如果在选项中设置WNOHANG调用waitpid(),它至少有一个由pid指定的子进程,其状态不可用,并且状态对于pid指定的任何进程均不可用,返回0。您所看到的正是根据规范。孩子还没有死,所以你不能得到状态,但是因为你使用了WNOHANG,所以你得到0并且立即返回,而不是等到孩子退出。 -
是的,我知道了。对不起,我意识到这是一个愚蠢的问题。我使用的文档包含一个错误。感谢您的帮助!
标签: c process fork sleep suspend