You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:31:05