exec函数族
exec替换进程印象:
在进程的创建上unix/linux采用了独特第一个方法,它将创建进程和加载一个新进程映像分离。这样的好处是有更多的余地对两种操作进行管理。
当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用exec系列的函数来进行。当然,exec系列的函数也可以将当前进程替换掉。
extern char **environ;
这个参数中以键值对的形式保存了系统环境变量
extern char **environ;
int main()
{
int i = 0;
printf("pid = %d \n", getpid());
for(i = 0; environ[i] != NULL; i++)
{
printf("%s\n", environ[i]);
}
printf("\n");
return 0;
}
int execl(const char *path, const char *arg, ...);
l 表示 参数是一个参数列表 长度可变,字符串应该用null结尾(用null结尾的作用是当遍历到字符串数组的最后一个变量的时候如果是null的话就知道是字符串数组的结构)
execpl(”/bin/ls”, “ls”, “-lt”,NULL);
int execlp(const char *file, const char *arg, ...);
这个函数不需要填需要执行文件的路径,只需要写入执行文件的名字,系统会按照环境变量path所包含的路径去查找
execpl(”ls”, “ls”, “-lt”, NULL);
int execle(const char *path, const char *arg, ..., char * const envp[]);
这里可以修改environ的值,否则就是默认的系统环境变量,如图1。
使用execle的代码
int main(int arg, char* argv[])
{
printf("the old process\n");
char * const envp[] = {"name=123", "age=12"};
execle("./hello", NULL, envp);
return 0;
}
int execv(const char *path, char *const argv[]);
这个函数效果和execl相同只是传递参数的方式不同,是一个字符数组而不是参数列表,需要注意的是字符串数组也许用用null结尾
int execvp(const char *file, char *const argv[]);
这个函数效果和execp相同只是传递参数的方式不同,是一个字符数组而不是参数列表,需要注意的是字符串数组也许用用null结尾
char * contst argv[] = {"ls", "-l", NULL};