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

execve如何执行命令?我的ls命令执行代码持续报错

问题分析与修正

1. execve的核心原理

execve系统调用的作用是用新程序直接替换当前进程的内存空间,它不会创建新进程,而是覆盖当前进程的代码、数据等资源。调用成功的话,原进程里execve之后的代码(比如你写的printf)根本不会执行;只有调用失败时,才会返回-1,继续走后续逻辑。

它的三个参数规则:

  • 第一个参数:必须是可执行文件的绝对/相对路径(比如ls的默认路径是/bin/ls)
  • 第二个参数:传给新程序的命令行参数数组,第一个元素是程序名,最后必须以NULL结尾
  • 第三个参数:传给新程序的环境变量数组,传NULL表示继承当前进程的环境变量

2. 你的代码错误点

  • 第一个参数传了/tmp,这是目录不是可执行文件,execve找不到可执行程序,必然报错
  • 缺少/tmp这个目标目录参数,你要执行的是ls -l /tmp,所以argv数组里得加上"/tmp"

3. 修正后的代码

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

int main() {
    // 命令行参数:程序名ls,选项-l,目标目录/tmp,结尾必须用NULL终止
    char *argv[] = {"ls", "-l", "/tmp", NULL};
    // 环境变量传NULL,继承当前进程的环境配置
    int ret = execve("/bin/ls", argv, NULL);
    // 只有execve调用失败才会走到这里
    perror("execve failed");
    printf("返回值:%d\n", ret);
    return 0;
}

补充说明

  • 可以用which ls命令查看系统中ls的实际路径,确保第一个参数正确
  • 如果execve调用成功,后面的printf和return语句不会执行,因为当前进程已经被ls程序替换了
  • 调用失败时,用perror能打印具体错误原因(比如权限不足、文件不存在等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:26:01