它应该处于睡眠状态时的活动过程

时间:2015-01-05 02:43:55

标签: c process fork sleep suspend

根据下一行代码中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;
}

提前感谢!

1 个答案:

答案 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?

POSIX waitpid()

规范说:

  

返回值

     

如果由于子进程的状态可用而返回waitpid()wait(),则这些函数将返回一个值,该值等于报告其状态的子进程的进程ID。如果waitpid()wait()由于向调用进程发送信号而返回,则返回-1并将waitpid()设置为[EINTR]。 如果errno中设置的WNOHANG调用waitpid(),则options至少有一个子进程,其状态不可用,并且状态不适用于任何进程由pid指定,返回0。否则,将返回-1,并设置pid以指示错误。

重点增加

您所看到的正是根据规格。孩子还没有死,所以你不能获得一个状态,但是因为你使用errno,你得到0并立即返回,而不是等到孩子退出。