linux下的exec函数族

linux 下,exec函数族有6种不同的调用形式:

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

在使用了fork 或 vfork 创建子进程后,子进程通常会调用exec函数来执行另外一个程序 . 系统调用exec 用于执行一个可执行的程序以代替当前进程的执行映像.
(注 : exec 调用并没有生成新进程, 一个进程一旦调用 exec函数,它本身就"死亡"了,系统把代码段替换成新的程序代码, 废弃原有的数据段和堆栈段, 并为新程序分配新的数据段与堆栈段, 唯一保留的是进程的id , 也就是说对系统而言, 还是同一个进程, 不过执行的是另外一个程序了)

1. execv函数 :  execv 函数通过路径名方式调用可执行文件作为新的进程映像 . 它的argv参数用来提供给main函数的argv 参数. argv 参数是一个以NULL结尾(最后一个元素必须是一个空指针) 的字符串数组.

2. execve 函数 : 在该系统调用中, 参数path 是将要执行的程序的路径名, 参数argv, envp与main 函数的argv, envp 对应.
(注: 参数argv 和参数 envp 的大小都是受限制的.linux 操作系统通过宏 ARG_MAX来限制它们的大小, 如果它们的容量之和超过所定义的值将会发生错误. 这个宏定义在中.)

3.execl 函数: 该函数与execv函数用法类似. 只是在传递 argv参数的时候, 每个命令行参数都声明为一个单独的参数(参数中使用"..."说明参数的个数是不确定的),要注意的是这些参数要以一个空指针作为结束.

4. execle函数: 该函数与execl 函数用法类似, 只是要显式指定环境变量. 环境变量位于命令行参数最后一个参数的后面,也就是位于空指针之后.

5.execvp函数 : 该函数和execv函数用法类似, 不同的是参数filename. 该参数如果包含"/",就相当于路径名; 如果不包含"/", 函数就得到PATH环境变量定义的目录中寻找可执行文件.

6. execlp函数 : 该函数类似于execl函数,它们的区别和execvp和execv 的区别一样.

exec 函数族的6个函数中只有execve 是系统调用. 其他5个都是库函数,它们实现时都调用了 execve .
正常情况下, 这些函数是不会返回的, 因为进程的执行映像已经被替换, 没有接受返回值的地方. 如果有一个错误的事件, 将会返回-1.

exec 函数错误:
EACCES        指向的文件或脚本文件没有设置可执行位,即指定的文件是不可执行的
E2BIG                新程序的命令行参数与环境变量容量之和超过ARG_MAX
ENOEXEC    由于没有正确的格式,指定的文件无法执行
ENOMEM    没有足够的内存空间来执行指定的程序
ETXTBUSY    指定文件被一个或多个进程以可写的方式打开
EIO                          从文件系统读入文件时发生I/O错误


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值