Linux中子进程调用exit(1)时父进程wait返回256的原因是什么
问题原因解释
wait()返回的status的位结构
Linux系统中wait()系统调用传入的int *status指针指向的整型值不是直接存储子进程的退出码,而是一个包含多类进程终止信息的位域结构体,从低位到高位不同位段对应不同含义:
- 低7位:记录导致进程终止的信号编号,若进程正常退出该值为0
- 第8位:标记进程终止时是否生成了core dump文件
- 次低8位(位8到位15):仅当进程正常退出时有效,存储子进程调用
exit()传入的退出码 - 剩余高位暂未投入使用
现象对应计算逻辑
你观测到的数值完全符合上述位结构的规则:
- 子进程调用
exit(0)时,位8到位15存储的退出码为0,低8位全为0,最终整数值为0 << 8 = 0,和你测试的结果一致 - 子进程调用
exit(1)时,位8到位15存储的退出码为1,低8位全为0,最终整数值为1 << 8 = 256,正好是你拿到的结果
正确获取子进程退出码的方式
Linux在<sys/wait.h>头文件中提供了标准宏来解析status值,不要直接读取status的整数值:
- 先用
WIFEXITED(status)判断进程是否为正常退出,返回非0代表正常退出 - 确认正常退出后,用
WEXITSTATUS(status)提取位8到位15的退出码,就能直接拿到你传给exit()的原始值
修改后的父进程逻辑参考:
else { printf("Hi! I am parent : %d\n",getpid()); pid = wait(&status); if (WIFEXITED(status)) { printf("Child %d exit code is : %d\n", pid, WEXITSTATUS(status)); } printf("Parent finished\n"); }
运行这段代码你就能看到传入exit(1)时拿到的退出码是1了。
额外说明
子进程的退出码最多只支持8位无符号整数,也就是取值范围是0~255,如果你传入的参数超过255,会自动截断取低8位,比如exit(257)最终拿到的退出码会是1。
内容的提问来源于stack exchange,提问作者Aditya Sadhukhan
相关产品推荐
相关产品推荐

