网站的策划建设方案书登录注册入口
目录
- 1、exec函数族的介绍
- 2、exec相关函数
1、exec函数族的介绍
2、exec相关函数
#include <unistd.h>
int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ );
/* - path 需要指定的执行的文件的路径或者名称,相对路径or绝对路径- arg 是执行可执行文件的参数列表- 第一个参数没有用- 最后一个参数为 NULLexecl("a.out", "a.out","10", NULL);execl("/bin/ps", "ps", NULL);
*/int execlp(const char *filename, const char *arg0, ... /*(char *)0 */ );
/*
- file 需要执行的可执行文件名
- execl("ps", "ps", NULL);
- 这个函数可以从环境路径自行查找
*/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 execvp(const char *filename, char *const argv[]);int fexecve(int fd, char *const argv[], char *const envp[]);
-
l(list)
参数地址列表,以空指针结尾 -
v(vector)
存有各参数地址的指针数组的地址 -
p(path)
按 PATH 环境变量指定的目录搜索可执行文件 -
e(environment)
存有环境变量字符串地址的指针数组的地址,自行指定环境路径
前六个为标准c库中的函数,最后一个为Linux中的系统函数。用的最多的就是前两个
下面对前两个函数做一个详细说明:
execl
/* #include <unistd.h>int execl(const char *path, const char *arg, ...);- 参数:- path:需要指定的执行的文件的路径或者名称a.out /home/nowcoder/a.out 推荐使用绝对路径./a.out hello world- arg:是执行可执行文件所需要的参数列表第一个参数一般没有什么作用,为了方便,一般写的是指定的可执行的程序的名称从第二个参数开始往后,就是程序执行所需要的的参数列表。参数最后需要以NULL结束(哨兵)- 返回值:只有当调用失败,才会有返回值,返回-1,并且设置errno如果调用成功,没有返回值。*/
#include <unistd.h>
#include <stdio.h>int main() {// 创建一个子进程,在子进程中执行exec函数族中的函数pid_t pid = fork();if(pid > 0) {// 父进程printf("i am parent process, pid : %d\n",getpid());sleep(1);//如果没有sleep,可以试一下打印结果}else if(pid == 0) {// 子进程// execl("hello","hello",NULL);execl("/bin/ps", "ps", "aux", NULL);perror("execl");printf("i am child process, pid : %d\n", getpid());//如果execl执行成功,那么这行代码是不会被执行的,且下面的for循环也只会被父进程执行,而不会被子进程执行。子进程只会执行可执行程序中的代码}for(int i = 0; i < 3; i++) {printf("i = %d, pid = %d\n", i, getpid());}return 0;
}
这段程序里通过execl通了两个例子,一个是hello.c程序,一个是ps指令
execlp
/* #include <unistd.h>int execlp(const char *file, const char *arg, ... );- 会到环境变量中查找指定的可执行文件,如果找到了就执行,找不到就执行不成功。- 参数:- file:需要执行的可执行文件的文件名a.outps- arg:是执行可执行文件所需要的参数列表第一个参数一般没有什么作用,为了方便,一般写的是执行的程序的名称从第二个参数开始往后,就是程序执行所需要的的参数列表。参数最后需要以NULL结束(哨兵)- 返回值:只有当调用失败,才会有返回值,返回-1,并且设置errno如果调用成功,没有返回值。int execv(const char *path, char *const argv[]);argv是需要的参数的一个字符串数组char * argv[] = {"ps", "aux", NULL};execv("/bin/ps", argv);int execve(const char *filename, char *const argv[], char *const envp[]);char * envp[] = {"/home/nowcoder", "/home/bbb", "/home/aaa"};*/
#include <unistd.h>
#include <stdio.h>int main() {// 创建一个子进程,在子进程中执行exec函数族中的函数pid_t pid = fork();if(pid > 0) {// 父进程printf("i am parent process, pid : %d\n",getpid());sleep(1);}else if(pid == 0) {// 子进程execlp("ps", "ps", "aux", NULL);printf("i am child process, pid : %d\n", getpid());}for(int i = 0; i < 3; i++) {printf("i = %d, pid = %d\n", i, getpid());}return 0;
}
execlp与execl的不同之处就在于:execlp的第一个参数只需要是可执行文件的参数名,该函数会到环境变量中查找指定的可执行文件,如果找到了就执行,找不到就执行不成功。而execl的第一个参数是可执行文件的相对路径或者绝对路径