exec函数族解疑

      在上一篇文章:自己实现popen函数中使用了exec族中的execvp()函数实现了对输入命令的的执行,众所周知,exec族是一个相当庞大的族,一共有六个成员,但这六个成员实在长得太像,其用法也容易让人混淆,此文将以一个初学者的角度来解析这六个成员的用法(因为我就是一个初学者:)。本文将着重解决三个问题:怎么记,什么含义,怎么用

 

一、怎么记

      首先看exec函数族六成员,如下:

      #include <unistd.h> int execl(const char *pathname,const char *arg0,...,(char*)0); 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 execlp(const char *filename,const char *arg0,...,(char*)0); int execvp(const char *filename,char *const argv[]);

     最开始看到这些家伙觉得头都晕了,又多又长得像,感觉像是看一群非洲黑人,很难分清。

     其实,后来发现这六个函数其实很好记的,可以看到这六个成员都是exec打头,后面有四个字母l、v和p、e通过不同的组合衍生出了这六个函数,我们可以形象地把exec看做他们的爷爷,由于在遗传中,一代比一代有个性,所以,在爷爷的基础上爸爸辈拥有了自己的个性标志l、v,在爸爸辈的基础上孙子辈拥有了自己的个性标志p、e,于是可以看到:

      exec生了两个孩子execl和execv

            execl生了两个孩子execlp和execle

            execv生了两个孩子execvp和execve

    为什么是爸爸辈有lv而不是孙子辈呢?因为他们成年有钱又爱面子,所以正需要lv(不要告诉我你不知道lv是什么……),孙子们目前需要的是大人们为他们指引好前方的路,即(p)ath,以及为他们创造良好的环境,即(e)vironment,lv对他们来说是以后的事。

 

二、什么含义

     它们的族谱搞清楚了,也就把这六个家伙记住了,下面来解释一下这四个字母l v  p e各自的意思,了解了解他们都到底有什么个性:

     首先说说爸爸辈吧,爸爸辈的个性标志是l、v,l即list,v 即vector;一个是列表,一个是向量。什么是列表?就是排成一排一个个数下去的就是列表,所以你看有l的函数的参数都是arg0,arg1...argn...这样排下去的;什么是向量?可以迅速定位的东西就是向量,所以可以看到带v的参数都是通过argv[]数组的形式传进去的。

     再来说孙子辈,孙子辈个性标志为p、e,正如上文所说,p即path,e即evironment,分别表示路径和环境变量。注意这里的p,p的存在并不是指它的参数需要输入一个pathname,而他恰恰想说的是“我已经有p(athname)了,所以你只需要输入filename就OK了”,所以在所有带p的exec族函数族中都不需要输入一个路径,只需要输入直接要执行的命令或程序名就成;至于evironment多数情况下不会用到,就不用去管它了。

 

三、怎么用

      说了那么多,来两个实例是实在,回到上一篇文章:自己实现popen函数中的myopen代码,在第37行开始有如下两句:

        char *argv[] = {cmd,NULL};  

        if(execvp(cmd,argv)<0)          //用exec族函数执行命令   

       这里使用了execvp函数,主要功能是执行输入的cmd命令。对应于前面的函数原型,cmd就是filename,这里已经有了p(athname),所以参数中就不需要输入详细路径了;v意指其他参数需要以向量形式输入,所以这里先声明了一个数组argv,根据规定,第一个参数必须指向执行的命令本身,所以数组第一个元素是cmd,最后一个参数必须是NULL,这里不需要其他参数了,所以这里只需要两个元素了。

       这两句话用下列函数也可以等效地实现,如下:

            execlp(cmd,"sh", "-c", (char *) 0);   

            execl("/bin/sh", "sh", "-c", cmd, (char *) 0);                    
            execle("/bin/sh", "sh", "-c", cmd, (char *) 0,NULL);         //这里不需要环境变量,所以最后一个环境变量位为NULL
        

            ……

        其他函数类似。

 

参考资料,真诚致谢:

http://blog.chinaunix.net/u1/47395/showart_687813.html

你可能感兴趣的:(list,vector,cmd,null,Path)