exec函数族
程序员文章站
2022-07-15 09:25:56
...
1、exec函数族作用
- 让父子进程执行不相干的操作。
- 能够替换进程地址空间中的源代码.txt段
- 当前程序中调用另外一个应用程序(首先想到exec之前需要fork)
- 返回值:如果函数执行成功,不返回,执行失败,打印错误信息,退出当前进程
2、exec库函数
- execl(默认传递了环境变量)
函数原型如下:
int execl(const char *path, const char *arg, ...);
path:替换程序的路径。
arg:文件名称。
... :可变参数
注意:该函数的参数是可变的,因此在参数输入完之后需以(char*)0结束
示例:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <fcntl.h>
int main()
{
printf("pid = %d\n",getpid());
execl("/bin/ps","ps","-f",(char*)0);
return 0;
}
- execlp(不用传路径,程序在标准位置)
函数原型如下:
int execlp(const char *file, const char *arg, ...);
file:要加载程序的名称。
arg:文件名称。
... :可变参数。
注意:标准目录一般指/bin目录,bin目录存放的是可执行程序。
不过具体情况根据环境变量而定,可以通过环境变量来设置其他的标准目录。
因此也可以理解为根据环境变量来加载可执行程序。
示例:
# include <stdlib.h>
# include <stdio.h>
# include <unistd.h>
# include <fcntl.h>
int main()
{
execlp("ls","ls","-lah",(char *)0);//因为ls在标准目录(/bin),因此不用输入路径
return 0;
}
- execle(显示传递环境变量)
首先我们了解一下环境变量:
环境变量指的是一组值,从用户登录后就一直存在,很多应用程序需要依靠它来确定系统的一些细节,我们最常见的环境变量是PATH,它指出了应到哪里去搜索应用程序,如/bin;HOME也是比较常见的环境变量,它指出了我们在系统中的个人目录。环境变量一般以字符串"XXX=xxx"的形式存在,XXX表示变量名,xxx表示变量的值。
下面是我们常见的main函数的函数原型:
int main(int argc, char *argv[], char *envp[]);
argc:参数个数
argv:参数内容
envp:环境变量
execle函数原型如下:
int execle(const char *path, const char *arg, ..., char * const envp[]);
envp 存放环境变量的指针数组
示例:
# include <stdio.h>
# include <stdlib.h>
# include <fcntl.h>
# include <unistd.h>
int main(int argc, char *argv[], char *envp[])
{
execle("/bin/ls","ls","-lah", (char *)0, envp);
return 0;
}
- execv(将参数存入数组进行传递)
函数原型:
int execv(const char *path, char *const argv[]);
示例:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <fcntl.h>
int main()
{
char *argv[] = {"ps","-f",(char *)0};
execv("/bin/ps",argv);
return 0;
}
- execvp(不用传路径 + 将参数存入数组进行传递)
函数原型:
int execvp(const char *file, char *const argv[]);
示例:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <fcntl.h>
int main()
{
char *argv[] = {"ps","-f",(char *)0};
execvp("ps",argv);
return 0;
}
- 系统调用execve(路径 + 参数(数组) + 环境变量(数组))
上面的五个exec函数是库函数,这个是系统函数;上面的五个exec函数最终都是调用这个函数实现的。
函数原型:
int execve(const char *filename, char *const argv[], char *const envp[]);
示例:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <fcntl.h>
int main(int argc, char *argv[], char *envp[])
{
char *argvv[] = {"ps","-f",(char *)0};//argvv不同于main函数中的参数列表argv
execve("/bin/ps",argvv,envp);
return 0;
}
上一篇: 做一个更加努力的小兵!
下一篇: exec函数族