一尘不染

Linux中是否有任何标准的退出状态代码?

linux

如果进程的退出状态为0,则认为该进程已在Linux中正确完成。

我已经看到,分段错误通常会导致退出状态为11,尽管我不知道这仅仅是我工作的惯例(失败的应用程序都是内部的)还是标准的。

Linux中是否有用于进程的标准退出代码?


阅读 325

收藏
2020-06-02

共1个答案

一尘不染

wait(2)&co返回时,将8位返回码和8位终止信号编号混合为一个值

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>

int main() {
    int status;

    pid_t child = fork();
    if (child <= 0)
        exit(42);
    waitpid(child, &status, 0);
    if (WIFEXITED(status))
        printf("first child exited with %u\n", WEXITSTATUS(status));
    /* prints: "first child exited with 42" */

    child = fork();
    if (child <= 0)
        kill(getpid(), SIGSEGV);
    waitpid(child, &status, 0);
    if (WIFSIGNALED(status))
        printf("second child died with %u\n", WTERMSIG(status));
    /* prints: "second child died with 11" */
}

您如何确定退出状态?传统上,外壳程序仅存储8位返回码,但如果进程异常终止,则将高位设置为高位。

$ sh -c'出口42'; 回声$?
42
$ sh -c'kill -SEGV $$'; 回声$?
分段故障
139
$ expr 139-128
11

如果您看到的不是这个,则程序可能有一个SIGSEGV信号处理程序,该信号处理程序随后exit会正常调用,因此实际上并没有被信号杀死。(程序可以选择处理SIGKILL和以外的任何信号SIGSTOP。)

2020-06-02