您的位置:首页 > 其它

进程环境与进程控制(4): exec函数

2007-06-21 22:10 302 查看
1. 函数声明:
#include <unistd.h>
int execl(const char *pathname, const char *arg0, ... /* (char *) 0 */);
int execv(const char *pathname, char *const argv []);
int execle(const char *pathname, const char *arg0, ...
/* (char *)0, char *const envp[] */);
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0, ... /* (char *) 0 */);
int execvp(const char *filename, char *const argv[]);
六个函数返回: 若出错则为- 1,若成功则不返回.

这些函数之间的第一个区别是前四个取路径名作为参数, 后两个则取文件名作为参数. 当指定filename作为参数时:
• 如果filename 中包含/, 则就将其视为路径名.
• 否则就按PATH环境变量, 在有关目录中搜寻可执行文件.
第二个区别与参数表的传递有关(l表示表(list), v表示矢量(vector)). 函数execl, execlp和execle要求将新程序的的每个命令行参数都说明为一个单独的参数. 这种参数表以空指针结尾.
对于另外三个函数execv, execvp和execve则应先构造一个指向各参数的指针数组, 然后将该数组地址作为这三个函数的参数.

2. 这六个函数中, 只有execve是系统调用, 其他函数只是库函数, 各种不同的实现, 最终还是要调用execve的.
execl的三个函数都是通过构造argv调用execv的三个不同函数, 而execvp试path前缀调用execv, execv使用环境变量调用execve系统调用.

3. exec函数主要用于fork之后子进程调用, 实现多进程操作.
#include <sys/types.h>
#include <sys/wait.h>

char *env[] = {"USER=unknown", "PATH=/tmp", NULL};

int main()
{
pid_t pid;

if ((pid = fork()) < 0)
/* Error Handler */
else if (pid == 0)
execle...

if (waitpid(pid, NULL, 0) < 0)
/* Error Handler */

if ((pid = fork()) < 0)
/* Error Handler */
else if (pid == 0)
execlp...

return 0;
}
本程序中, execle要求的参数是一个程序路径和一个自定义的特定环境;
execlp要求的参数是一个文件名, 并接收系统环境变量, 这里的调用会继承前面execle添加的环境.

4. exec注意事项:
最后一个命令行参数之后要跟一个空指针, 如果是0, 要强制转换成(char *), 不然会报错.

5. 方便记忆:
为了使这6个函数方便记忆, 下面用函数名中的字符说明一下:
l: 表示该函数取一个参数表, 与v互斥.
v: 表示该函数取一个argv[]矢量.
e: 表示该函数取一个envp[]数组, 而不使用当前环境变量.
p: 表示该函数取filename作为参数, 并且用PATH环境变量寻找可执行文件.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: