【问题标题】:What kills the parent process?是什么杀死了父进程?
【发布时间】:2019-05-28 10:19:13
【问题描述】:

这段代码中父进程的结束是什么?我看没有看到他从任何地方退出...... 我的一个朋友说父母没有结束/杀死,代码只是停在最后一个出口(0)。如果是这种情况,那么是什么将父进程从睡眠中唤醒?提前谢谢你

adghtesd

节目结果:

    parent: I'm the parent
    child: I'm the child
    child: I'm exiting
    parent: child process (PID=1919) exited with value 123
    parent: exiting
    test

【问题讨论】:

  • 父进程运行函数il_parent。然后il_parent 函数返回,并返回到main 函数及其switchswitch 结束,最后的exit(0) 函数被调用。如果您尝试通过rubber duck debugging 或通过在实际调试器中单步调试代码来调试程序,则可以轻松验证这一点。
  • @Someprogrammerdude 但代码在孩子结束工作后立即停止。注意孩子有 3 秒的睡眠,父母有 10 秒,但是在孩子结束后,父母立即停止睡眠,代码以 exit(0) 结束。
  • @MrMoil 顺便说一句,不允许从信号处理程序调用exit(以及printf)。

标签: c unix process posix kill


【解决方案1】:

来自this POSIX reference on sleep

如果sleep()由于请求时间已过而返回,则返回值应为0。如果sleep()由于信号传递而返回,则返回值应为“未睡眠”量(请求时间减去实际睡眠时间)以秒为单位。

发生在你身上的是,当父进程收到SIGCHLD信号时,会导致sleep函数被中断,而父进程在sleep调用后继续。

如果你想睡足量,你需要检查sleep返回什么,然后循环调用sleep直到它返回0

【讨论】:

  • 另外,使用nanosleepclock_nanosleep 或 C11 thrd_sleep 实现这一点会更容易,因为它们提供了剩余时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
相关资源
最近更新 更多