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
相关产品推荐
相关产品推荐

