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

execve调用which命令无输出但ls正常的问题排查求助

问题原因与解决方法:execve调用which无输出

核心原因

你调用execve时第三个参数传了NULL,这会导致新进程的环境变量为空。而which命令的核心逻辑是依赖PATH环境变量查找目标可执行文件的位置,没有PATH的话,它无法定位ls的路径,因此没有任何输出。

反观ls,你这里调用的是无参数的ls,仅负责列出当前目录内容,不需要依赖PATH环境变量,所以即使环境为空也能正常工作。

解决方案

有两种方式可以解决这个问题:

方案1:传递当前进程的环境变量

使用全局变量environ(需要提前声明),它保存了当前进程的所有环境变量,直接传给execve即可:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

// 声明全局环境变量数组
extern char **environ;

int main(void)
{
    char    *cmd_args_joined[] = {"which", "ls", NULL};
    char    cmd_plus_path[] = "/usr/bin/which";

    if (execve(cmd_plus_path, cmd_args_joined, environ) < 0)
    {
        perror("failed at execve");
        exit(1);
    }
    return (0);
}

方案2:手动构造所需的环境变量

如果不需要完整的环境变量,仅构造包含PATH的最小环境数组即可:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(void)
{
    char    *cmd_args_joined[] = {"which", "ls", NULL};
    char    cmd_plus_path[] = "/usr/bin/which";
    // 手动指定PATH,根据你的系统实际路径调整
    char    *custom_env[] = {"PATH=/usr/bin:/bin:/usr/local/bin", NULL};

    if (execve(cmd_plus_path, cmd_args_joined, custom_env) < 0)
    {
        perror("failed at execve");
        exit(1);
    }
    return (0);
}

验证

修改代码后重新编译运行,which就能正常输出ls的完整路径了。

内容的提问来源于stack exchange,提问作者mehdi mirzaie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:45:19