小何讲进程:Linux中的exec函数族讲解

1.  exec函数族-exec()函数族说明
使用exec函数族主要有两种情况
  • 当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用exec函数族中的任意一个函数让自己重生;
  • 如果一个进程想执行另一个程序,那么它就可以调用fork()/vfork()函数新建一个进程,然后调用exec函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。 


2.  exec函数族-exec()函数族语法:

小何讲进程:Linux中的exec函数族讲解_第1张图片


3.  exec函数族中的6个函数的区别 
     这6个函数在函数名和使用语法的规则上都有细微的区别,下面根据可执行文件的查找方式、参数表传递方式及环境变量传递这三个方面进行比较。

  • 查找方式。
前4个函数的查找方式都是根据完整的文件目录路径和文件名查找可执行文件的。
而最后2个函数(也就是以p结尾的两个函数)可以只给出可执行文件名,系统就会自动按照环境变量“$PATH”所指定的路径进行查找。

  • 参数传递方式。
exec函数族的参数传递有两种方式:
一种是逐个列举的方式(l)
另一种则是将所有参数整体构造指针数组传递(v)。
在这里是以函数名的第5位字母来区分的
字母为“l”(list)的表示逐个列举参数的方式,其语法为char *arg;
字母为“v”(vector)的表示将所有参数整体构造字符指针数组传递,其语法为*const argv[]。
观察execl()、execle()、execlp()的语法与execv()、execve()、execvp()的区别。

注意:

参数实际上就是用户在执行这个可执行文件时所需的全部命令选项字符串(包括该可执行程序名本身)。
参数必须以NULL表示结束,如果使用常数0表示一个空指针,则必须要把它强制转化成一个字符指针((char *)0),否则exec将把它解释为一个整型参数。
例如:执行cat命令连接显示两文件内容
execl("/bin/cat","cat","/root/test1.c","/root/test2.c",NULL);
或者execlp("cat","cat","/root/test1.c","/root/test2.c",NULL);
char *argv[]={"cat","/root/test1.c","/root/test2.c",NULL};
execv("/bin/cat",argv);
或者:execvp("cat",argv);

  • 环境变量

exec函数族可以使用系统默认的环境变量,也可以传入指定的环境变量(进程想要为将运行的程序指定一个确定的环境时)。
通过以“e”(environment)结尾的两个函数execle()和execve()就可以在envp[]中指定当前进程所使用的环境变量。

  • 如何记忆这6个函数
这六个exec函数的参数很难记忆。函数名中的字符会给我们一些帮助:
字母 p表示可以只给出可执行文件名,系统会自动按照PATH环境变量所指定的路径寻找可执行文件,它与字母e互斥。
字母l表示该函数使用一个参数列表传递参数,它与字母v互斥。
v表示该函数使用一个char * argv[ ]传递参数。
最后,字母e表示该函数使用char * envp[ ] 传递环境量变,而不使用当前环境。

小何讲进程:Linux中的exec函数族讲解_第2张图片


4.  exec使用实例:

/*  execlp.c  */

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
	int ret=0;
	if(fork()==0)
	{
		if((ret=execlp("ps","ps","-ef",NULL))<0)
		{
			printf("Execlp error! \n");
		}
	}	
	return 0;
}
运行截图:

小何讲进程:Linux中的exec函数族讲解_第3张图片

你可能感兴趣的:(linux,进程,区别,实例,exec函数族)