【系统编程】进程--exec函数族(execl、execlp、execle、execv、execvp、execve)

1、exec族函数说明

        fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我的程序们希望子进程去执行另外,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。

所谓exec函数族,其实有六种以exec开头的函数,统称exec函数:execl、execlp、execle、execv、execvp、execve

2、在Linux中使用exec函数族主要有以下两种情况

2.1、当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用任何exec 函数 族让自己重生。

2.2、如果一个进程想执行另一个程序,那么它就可以调用fork函数新建一个进程,然后 调用任何一个exec函数使子进程重生

 

3、函数

         exec函数族名字很相近,使用起来也很相近,它们的一般规律如下:

          l (list)                          参数以罗列方式传递

          p (path)                      搜素file时使用path变量(以文件名的方式查找可执行文件,系统会自动从$PATH查找)

          v (vector)                   参数以指针数组的方式传递

          e (environment)         使用环境变量数组,不使用进程原有的环境变量,设置新加载程序运行的环境变量

                                            (可以传递自己设定的环境变量,比如”PATH=/bin:/usr/bin”)

3.1、int execl(const char *path, const char *arg, .../* (char  *) NULL */);

参数: 1、path 可执行程序的路径

            2、arg 如果这个可执行程序需要传参,罗列参数,后面以NULL 为结束标志

说明:表示后边的参数以可变参数的形式给出且都以一个空指针结束。这里特别要说明的是,程序名也是参数,所以第一个参数就是程序名。

#include <stdio.h>
#include <unistd.h>
int main()
{
	printf("process begin...\n");
	//execl("/bin/ls", "ls", NULL);
        execl("/bin/ls", "ls", "-a", "-l", "-h", NULL);
	printf("process end...\n");
	return 0;
}

3.2、int execlp(const char *file, const char *arg, .../* (char  *) NULL */);

      参数: 1、file 可执行文件的文件名

                  2、arg 如果这个可执行程序需要传参,罗列参数,后面以NULL 为结束标志

      说明:表示第一个参数无需给出具体的路径,只需给出函数名即可,系统会在PATH环境变量中寻找所对应的程序,如果没找到的话返回-1。

#include <stdio.h>
#include <unistd.h>
 
int main()
{
	printf("process begin...\n");
	execlp("ls", "ls", "-l", NULL);
	printf("process end...\n");
	return 0;
}

      3.3、int execle(const char *path, const char *arg, .../*, (char *) NULL, char * const envp[] */);

     参数: 1、path 可执行文件的文件名

                 2、arg 如果这个可执行程序需要传参,罗列参数,后面以NULL 为结束标志

                 3、envp[] 环境变量

     说明:将环境变量传递给需要替换的进程,原来的环境变量不再起作用

#include <stdio.h>
#include <unistd.h>
 
int main()
{
	printf("process begin...\n");
	char *envp[] = {"AA=11", "BB=22", NULL};
	execle("./env", "env", NULL, envp);
	printf("process end...\n");
	return 0;
}

      3.4、int execv(const char *path, char *const argv[]);

       参数: 1、path 可执行程序的路径

                   2、argv 传递参数的指针数组

      说明:execv() 和 execl() 的用法基本是一样的,无非将列表传参,改为用指针数组。

#include <stdio.h>
#include <unistd.h>
int main()
{
	printf("process begin...\n");
	char *arg[]={"ls", "-a", "-l", "-h", NULL};
        execv("/bin/ls", arg)
	printf("process end...\n");
	return 0;
}

 

     3.5、int execvp(const char *file, char *const argv[]);

      参数: 1、file 可执行文件的文件名

                  2、argv 传递参数的指针数组

     说明:表示命令所需的参数以char *arg[]形式给出且arg最后一个元素必须是NULL

#include <stdio.h>
#include <unistd.h>
 
int main()
{
	printf("process begin...\n");
	char *argv[] = {"ls", "-a", "-l", NULL};
	execvp("ls", argv);
	printf("process end...\n");
	return 0;
}

    3.6、int execvpe(const char *file, char *const argv[],char *const envp[]);

      参数: 1、file 可执行文件的文件名

                  2、argv 传递参数的指针数组

                  3、envp[] 环境变量

参考博客:

[1]https://blog.csdn.net/yychuyu/article/details/80173039

[2]https://blog.csdn.net/lianghe_work/article/details/47704105

 

 

 

发布了64 篇原创文章 · 获赞 82 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40602000/article/details/101163534
今日推荐