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错误
#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错误