execve执行失败时如何让子进程返回127退出状态码?
问题分析与解决方案
你的程序在execve调用失败时,子进程退出状态码为0的原因是:当execve执行失败,子进程会执行perror("error"),但之后没有主动终止进程,会继续执行到main函数末尾。而C语言中,main函数如果没有显式return或exit,默认返回0,所以子进程的退出状态码就是0。
要实现和bash一致的127返回值,只需要在execve失败后,让子进程主动以127的状态码退出即可。
修改后的代码
#include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> int main () { char *argv[] = {"ls",NULL}; char *envp[] = {NULL}; int status; int pid; int err; pid = fork(); if (pid == 0) { execve("/usr/bin/lds", argv, envp); perror("error"); // execve失败后,以127状态码退出 exit(127); } else { waitpid(pid, &status, 0); // 正确获取子进程的退出码 if (WIFEXITED(status)) { err = WEXITSTATUS(status); printf("子进程退出码:%d\n", err); } exit(err); } }
补充说明
WIFEXITED(status)用于判断子进程是否正常退出WEXITSTATUS(status)用于提取正常退出时的状态码,直接打印status会得到包含退出码和其他信息的整数值(比如低8位是退出码,高8位可能有其他标识),所以需要用这两个宏来正确解析。
内容的提问来源于stack exchange,提问作者user16715270
相关产品推荐
相关产品推荐

