退出码(exit status,或exit code)的约定

本文详细解释了退出码的约定,包括0表示成功,非0表示失败,2表示用法不当,127表示命令未找到,126表示不是可执行文件。此外,还介绍了大于等于128的退出码通常由信号产生。

退出码(exit status,或exit code)的约定:

0表示成功(Zero - Success)

非0表示失败(Non-Zero  - Failure)

2表示用法不当(Incorrect Usage)

127表示命令没有找到(Command Not Found)

126表示不是可执行的(Not an executable)

>=128 信号产生

<think>我们正在讨论如何获取子进程的退出状态码。根据用户提供的引用,我们可以从多个角度来回答这个问题。主要涉及Linux系统编程(C语言)和Shell脚本中的方法,以及Python中multiprocessing模块的方法(因为用户之前的问题涉及Python多进程)。 1. 在Linux C编程中,使用waitpid()函数获取子进程退出状态码(如引用[2]所示)。 2. 在Shell脚本中,通过特殊变量$?获取上一个命令的退出状态码(如引用[3]所述)。 3. 在Python中,使用multiprocessing模块的Process对象的相关方法获取子进程退出码。 由于用户之前的问题是关于Python多进程的,我们重点介绍Python中的方法,同时简要提及其他方法。 步骤: 1. 在Linux C中获取子进程退出码: 使用fork()创建子进程,在子进程中执行代码并exit(状态码)。父进程使用waitpid()等待子进程结束,并通过status参数获取退出码退出码存储在status的高8位(低8位存储信号信息)。因此,用(status>>8)&0xFF获取退出码2. 在Shell脚本中: 执行命令后,使用$?获取上一个命令的退出状态码。 3. 在Python中(multiprocessing模块): 使用Process对象创建子进程,然后通过以下步骤获取退出码: - 调用子进程对象的join()方法等待子进程结束(可选,但如果不等待,子进程可能还没结束,无法获取退出码)。 - 使用子进程对象的exitcode属性获取退出码。 注意:在Python中,子进程退出码的含义: exitcode为None:子进程尚未结束。 0:表示成功退出。 负值:表示子进程被信号终止,具体信号为-exitcode。 正值:表示子进程退出时返回的退出码(通常由exit()sys.exit()指定)。 示例代码(Python): 我们将创建一个子进程,在子进程中运行一个函数,该函数退出时返回一个状态码(例如10)。父进程等待子进程结束并打印退出码。 同时,我们也会简要说明如何用Shell和C语言实现。 注意:用户引用中提到了退出状态码的范围(0~255),在Python中,我们通常使用0~255的整数(但Python本身不限制,不过为了跨平台,最好使用这个范围)。 下面给出详细解答: </think> ### 如何获取子进程的退出状态码 在编程中获取子进程的退出状态码主要有三种常用方法,下面按技术栈分类说明: --- #### 1. **Linux C/C++ 编程**(使用`waitpid()`系统调用) ```c #include <sys/wait.h> int main() { pid_t pid = fork(); if (pid == 0) { // 子进程逻辑 exit(42); // 设置退出码为42 } else { int status; waitpid(pid, &status, 0); // 等待子进程结束 if (WIFEXITED(status)) { int exit_code = WEXITSTATUS(status); // 提取退出码 printf("子进程退出码: %d\n", exit_code); // 输出42 } } } ``` - **关键函数**: - `waitpid()`:等待指定子进程结束 - `WIFEXITED()`:检查是否为正常退出 - `WEXITSTATUS()`:从状态值提取退出码(范围 0-255)[^2] - **原理**:退出码存储在`status`变量的**高8位**,需通过位运算提取 --- #### 2. **Shell 脚本**(使用`$?`变量) ```bash # 运行子进程 ./child_process # 获取退出码 exit_code=$? echo "子进程退出码: $exit_code" # 输出上一个命令的退出码 ``` - **特性**: - `$?` 始终存储**上一个命令**的退出状态码 - 范围 0-255,0 表示成功,非0 表示错误[^1][^3] - **示例场景**: ```bash grep "pattern" file.txt if [ $? -eq 0 ]; then echo "匹配成功" else echo "匹配失败,错误码: $?" fi ``` --- #### 3. **Python**(使用`multiprocessing`模块) ```python import multiprocessing def child_task(): return 42 # 退出码 if __name__ == "__main__": process = multiprocessing.Process(target=child_task) process.start() process.join() # 等待子进程结束 exit_code = process.exitcode print(f"子进程退出码: {exit_code}") # 输出42 ``` - **关键属性**: - `exitcode`:子进程结束后的退出状态 - `None`:进程未结束 - `0`:成功退出 - 正数:程序返回的退出码 - 负数:被信号终止(如 `-9` 表示 `SIGKILL`) --- ### 关键知识点 1. **退出码范围**: - 所有场景均使用 **0-255** 的整数值 - `0` 始终表示成功,非零值表示错误类型[^1] 2. **父子进程同步**: - 父进程必须等待子进程结束(如`waitpid()``join()`) - 未等待时获取的退出码可能无效 3. **错误处理**: - 需区分正常退出(通过`exit()`)与信号终止(如段错误) - C中通过`WIFSIGNALED(status)`检查信号终止 > 示例:Python中子进程被终止的场景 > ```python > process.terminate() # 发送SIGTERM > process.join() > print(process.exitcode) # 输出 -15(SIGTERM的信号值) > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值