exec作为Linux进程的控制原语,常用的调用方式是:
1. 调用fork()创建一个子进程
2在子进程中调用exec原语,
使程序执行另一个程序或者一个Shell文件。
此时子进程的进程ID不变,只是替换掉子进程中的正文、数据、堆、栈。
exec系列函数包括六个:
int execl(const char *pathname, const char *arg0, ...);
int execv(const char *pathname,
char* const argv[]);
int execle(const char *pathname, const char *arg0,...);
int execve(const char *pathname, char* const argv[], char* const envp[]);
int execlp(const char *filename ,const char *arg0, ...);
int execvp(const char *filename, char *const argv[]);
第一个参数如果包含了‘/’则表示路径,否则为filename。
如果为filename 则程序搜索范围$PATH环境变量下的所有路径。
在PATH路径下末尾有个:表当前目录,如果它出现在中间则表示形式为::,开头:,注意有些情况要求搜索路径中绝不要包括当前目录。
注意以上六个函数记忆方式:以p结尾表示,它是调用当前进程的$PATH来找到对应的可执行文件的,如果以e结尾表示,它需要显示传入一个环境值(一般用字符串数组表示)。函数中带有l的表示它需要的参数list,而如果为v则表示,它需要的是参数矢量vector。
下面是一个实例:
一个可执行程序仅函数体部分:
int main(int avgc, char* argv[])
{
//参数列表
//保存环境列表(字符串数组)
extern char** environ;//(全局变量)
char** ptr;
int i;
for(i=0; i
printf("argv[%d]:%s\n", i, argv[i]);
for(ptr=environ; *ptr!=0; ptr++)
printf("%s\n", *ptr);
return 0;
}
//程序主体
//这里调用的是一个exe程序,当然也可以调用一个shell脚本
#include
#include
#include
#include
//环境变量字符串指针
char* envir[] = {"USER=unknown", "PATH=/home/snert/C++/test_Invote_exec", NULL};
int main()
{
//创建一个子进程
//在子进程中调用execle();
//程序参数列表
int i;
pid_t pid;
if (pid = fork() != 0)
{
//fork调用失败和父进程退出
_exit(0);
}
//子进程调用execle
if ((i = execle("New_Program", "./New_Program", "param2", "param3", (char*) 0, envir)) == -1)
{
printf("execle failed_error ID:%d_is%s\n", errno, strerror(errno));
}
else
{
printf("execle Successed!");
}
sleep(10);
return 0;
}