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

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

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

推荐答案

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" */
}

您如何确定退出状态?传统上,shell只存储8位返回码,但如果进程异常终止,则设置高位.

$ sh -c 'exit 42'; echo $?
42
$ sh -c 'kill -SEGV $$'; echo $?
Segmentation fault
139
$ expr 139 - 128
11

如果你看到的不是这个,那么这个程序可能有一个SIGSEGV信号处理器,然后正常调用exit,所以它实际上不会被信号杀死.(程序可以 Select 处理除SIGKILLSIGSTOP之外的任何信号.)

Linux相关问答推荐

使用sed替换字符,但如果它是在bash csv文件中的字符串中,则不使用

通过shell 脚本基于AM/PM对日期时间字段进行排序

为什么 linux shell diff 命令有时会显示与空行相关的输出,即使存在 -B(--ignore-blank-lines)选项?

如何在 Linux 上打印带有屏蔽值的环境名称?

如何拆分和计算 Bash 中单词的出现次数?

将 Visual Studio C++ 项目迁移到 Linux 和 CMake

如何为命令的所有选项启用无密码 sudo?

Azure Nvidia 中的 apt-update 给出公钥错误

进程Forking 后 pthread_key_create() 生成的密钥会发生什么?

如何在 Linux 中获取 C/C++ 中的用户名?

应用程序如何在运行时解析为不同版本的共享库?

nvm:无法卸载当前活动的 node 版本

try 使用 sudo 将文件附加到根拥有的文件时权限被拒绝

比较文件的日期 bash

使用 SED 将单词的首字母大写

如何在 IE 中使用 Linux 进行测试

Linux:删除多个文件的文件扩展名

适用于 Windows、Linux、MacOS X 的跨平台脚​​本

未找到版本CXXABI_1.3.8(...要求)

在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403