exec函数_linux进程中exec函数族的使用

47a09218ad5b41d0b4b2ee2c34675c53.png

在linux进程中通常使用fork函数来创建父子进程,虽然fork函数采用的是写实拷贝技术,但是当创建的子进程并不想继续与父进程相关的操作时那些拷贝的内容就纯粹属于浪费,那么一个子进程怎样变成一个全新的进程,此时exec函数族的函数就派上用场了。

exec函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。

1b828becc06826229304c808742bcedb.png

exec函数族的函数原型如下:

int execl(const char *path, const char *arg, ...);

int execv(const char *path, char *const argv[]);

int execle(const char *path, const char *arg, ..., char *const envp[]);

int execlp(const char *file, const char *arg, ...);

int execvp(const char *file, char *const argv[]);

int execve(const char *path, char *const argv[], char *const envp[]);

exec函数族共有6个函数,其中的5个是库函数,只有execve是系统调用。下边来介绍函数名字中的’l’, ‘p’, ‘e’, ‘v’的含义。

‘l’表示传递的参数是以列表形式出现即分开的,需要一个一个的传递,比如:execl(“/bin/ps”, “ps”, “ajx”, NULL), 其中第一个参数代表传递的一个要执行的程序的路径,第二个参数必须和第一个参数的文件保持一致,后边的 ajx,NULL都是参数,而且最后一个参数必须是NULL。

‘v’参数表示函数传递的参数是以组合形式的传递而不用一个一个的传递比如:char *buf[] = {“ps”, “ajx”, NULL}; execv(“/bin/ps”, buf),其中buf这个指针数组包含了需要传递参数并且最有一个参数是NULL。

‘p’参数表示exec函数要传递可执行文件的名字,不需要传递文件路径,在执行时会从环境变量中来搜索执行,比如:

execp(“ps”, “ps”, “ajx”, NULL);

‘e’参数表示传递给新进程的环境变量,比如:

char *buf[] = {“PATH=/usr/bin”, NULL};

execle(“./test”, NULL, buf);那么在新的进程中环境变量PATH就变成/usr/bin下的内容了。

exec函数族可以通过不同的参数组合来运行一个新进程,只不过不同组合传递参数的方法和意义不同而已,只要掌握明白l, p, v, e的意义就可以搞定了。


推荐大家一个嵌入式资料分享交流群:707159742 入群有全套学习视频资料免费赠送(基础教程、ARM开发、QT编程,C语言、C++语言,Linux、数据结构。)

大神、小白聚集地


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值