【问题标题】:Active process when it should be in sleep应该处于睡眠状态的活动进程
【发布时间】: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


【解决方案1】:

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

最初的旁白

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

  • 为什么要写扭曲的 C? if ((p = fork()) == 0) 作为条件有什么问题? (不是每个人都同意我的观点,但你可以从我这里得到我的 cmets,其他人可以根据自己的选择发表不同的评论。)

  • 您应该错误检查您的系统调用,并打印显着信息(如 PID,如果waitpid() 报告成功,则打印s 中的值,并检查kill()。注意@ 987654329@ 返回除了孩子是否死了(它不会死)之外并没有告诉你太多。睡觉(没有死,程序可能会再次醒来 - 除非它先被杀死)和死(没有机会再次醒来)。waitpid() 函数只报告死去的孩子(或未追踪/停止的孩子——这里不是问题),而不是仍然活着的孩子,即使他们只是睡着了,正在等待信号.

你的问题

“子进程处于活动状态”是什么意思?它会休眠 10 秒。你的父母代码休眠1秒,做一个waitpid()立即返回,通常报告没有死去的孩子(因为孩子还没有睡完),然后你打断孩子(为什么2没写SIGINT?)。

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

waitpid() 返回 0,我期待它返回子进程的 PID。这是我不明白的。如果子进程被挂起,为什么waitpid()返回0而不是子进程的PID?

POSIX waitpid()

规范说:

返回值

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

强调

您所看到的完全符合规范。孩子还没有死,所以你不能得到状态,但是因为你使用了WNOHANG,所以你得到0并立即返回,而不是等到孩子退出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2019-01-12
    • 2015-02-12
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多