应该处于睡眠状态的活动进程

Active process when it should be in sleep

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

提前致谢!

评论变成了带有扩展信息的答案。

最初的旁白

  • 您的 return; 语句应该是 return 0; 并且您的编译器应该抱怨 return 在 return 的函数中没有值值。

  • 为什么要写扭曲的C? if ((p = fork()) == 0) 作为条件有什么问题? (不是每个人都会同意我的看法,但你可以从我这里得到我的评论,如果其他人愿意的话,他们可以发表不同的评论。)

  • 你应该错误检查你的系统调用,并打印显着信息(如 PID,如果 waitpid() 报告 waitpid() 之后 s 中的值成功,并检查 kill()。请注意,waitpid() returning 除了 child 是否已死(它不会死)之外,并没有告诉你太多信息. 休眠(没有死,程序可能会再次醒来——除非它先被杀死)和死(没有机会再次醒来)是有区别的。waitpid() 函数只报告死 children (或 untraced/stopped children — 这里不是问题),而不是 children 还活着,即使他们只是睡着了,等待信号。

你的问题

'the child process is active'是什么意思?它会休眠 10 秒。您的父母代码休眠 1 秒,立即执行 waitpid(),returns,通常报告没有死 children(因为 child 尚未完成休眠yet),然后你打断了child(为什么2没有写成SIGINT?)。

你在看什么;你在期待什么?

waitpid() returns 0 and I was expecting from it to return the PID of child process. This is what I don't understand. If child process is suspended, why does waitpid() return 0 instead of the PID of child?

POSIX waitpid()

规范说:

Return value

If wait() or waitpid() returns because the status of a child process is available, these functions shall return a value equal to the process ID of the child process for which status is reported. If wait() or waitpid() returns due to the delivery of a signal to the calling process, -1 shall be returned and errno set to [EINTR]. If waitpid() was invoked with WNOHANG set in options, it has at least one child process specified by pid for which status is not available, and status is not available for any process specified by pid, 0 is returned. Otherwise, -1 shall be returned, and errno set to indicate the error.

已强调

您所看到的完全符合规格。 child 还没有死,所以你不能得到一个状态,但是因为你使用了 WNOHANG,你得到 0 和一个立即的 return,而不是等到 [=78] =] 退出。