Linux中使用exec函数族详解及示例代码 | 嵌入式Linux应用开发篇 - 03

Miki ·
更新时间:2024-11-10
· 843 次阅读

1.exec函数族

exec 为 execute(执行),exec 函数族用来替换调用进程所执行的程序,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行,替换前后进程的 PID 不会改变。

exec函数族中包括6个函数:

#include int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg,..., char * const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[],char *const envp[]);

这些函数统称为exec函数族,只在参数存在差别,作用相同。

后缀l:使用 list 形式来传递新程序的参数,传给新程序的所有参数以可变参数的形式从 exec 给出,最后一个参数需要为 NULL 以表示结束后缀p:表示使用 filename 做参数,如果 filename 中包含“/”,则视为路径名,否则在 PATH 环境变量所指定的各个目录中搜索可执行文件; 后缀e:表示可以传递一个指向环境字符串指针数组的指针,环境数组需要以 NULL 结束; 后缀v:表示使用 vector 形式来传递新程序的参数,传给新程序的所有参数放入一个字符串数组中,数组以 NULL 结束以表示结束;

exec 函数族只有在出错的时候才会返回,如果成功,该函数无返回,否则返回-1。

2. execlp调用默认程序示例 /** * @brief 使用execlp拉起默认程序的示例程序 * @author Mculover666 * @note 创建一个子进程,拉起默认ping程序执行 */ #include #include #include int main(void) { pid_t pid; pid = fork(); if(pid < 0) { /* 创建子进程失败 */ printf("fork fail.\n"); return -1; } else if(pid == 0) { /* 子进程执行的程序 */ execlp("ping","ping","www.mculover666.cn","-c","4",NULL); return 0; } else { return 0; } }

编译:

gcc 03-execlp_test.c -o 03-execlp_test.o

执行:

3. 移植到嵌入式Linux开发板上运行测试

① 使用交叉编译工具重新编译程序:

arm-none-linux-gnueabi-gcc 03-execlp_test.c -o 03-execlp_test_arm.o

② 基于NFS文件系统,将可执行文件传到开发板上

cp 03-execlp_test_arm.o /nfs_root/

③ 开发板上执行该程序测试,结果如下:

接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。


作者:Mculover666



linux中 exec函数 嵌入式linux Linux exec 示例 嵌入

需要 登录 后方可回复, 如果你还没有账号请 注册新账号