【问题标题】:What is the difference between "termination status" and "end status" as returned from waitpid?从waitpid返回的“终止状态”和“结束状态”有什么区别?
【发布时间】:2020-09-10 19:35:39
【问题描述】:
在 Andrew S. Tanenbaum 和 Albert S. Woodhull 的 Operating Systems Design and Implementation 中,有以下片段:
"[...] 考虑退出,当进程完成执行时应该使用哪些进程。它有一个参数,退出状态(0 到 255),通过 statloc 返回给父进程 [如 waitpid(int , int *statloc, int)] 在waitpid系统调用中,status的低位字节包含终止状态,0为正常终止,
其他值是各种错误条件。 高位字节包含孩子的退出状态(0
到 255)。"
那么,这两个概念有什么区别呢?
【问题讨论】:
标签:
c
unix
process
posix
system-calls
【解决方案1】:
退出状态是指进程在正常程序终止时传递给exit函数(或从main返回)的值。
终止状态是指导致程序结束或停止的原因。换句话说,它是正常退出(如上所述),还是被信号终止。这也可以指示进程是否被信号停止(但未终止),或者它是否在停止后继续。这可能在调试进程时发生。
【解决方案2】:
退出状态是进程本身在调用exit 时提供的(或来自main 的返回值,它被定义为与调用exit 相同)。
但这不是终止进程的唯一方法。特别是,它可以被一个信号终止,如果程序段错误,或者被零除,或者如果某个其他进程向它发送一个终止信号,就会发生这种情况。在这些情况下,没有退出状态,因为程序永远无法调用exit()。然后,终止状态指示程序是否调用exit(),或者,如果不是,则指示导致终止的信号的编号。可能还有一些特定于实现的标志;例如,如果由信号终止的程序创建了核心转储,Linux 会在终止状态中设置一个标志。
有关可用于从waitpid 返回的状态值中提取此信息的宏,请参阅main waitpid。