📜  exec函数家族

📅  最后修改于: 2021-05-25 22:04:15             🧑  作者: Mango

exec函数家族用新进程替换了当前正在运行的进程。可以使用另一个C程序来运行C程序。它位于头文件unistd.h下。 exec系列中有许多成员,下面以示例显示。

  • execvp :使用此命令,创建的子进程不必运行与父进程相同的程序。 exec类型的系统调用允许进程运行任何程序文件,其中包括二进制可执行文件或shell脚本。句法:
    int execvp (const char *file, char *const argv[]);

    文件:指向与正在执行的文件关联的文件名。
    argv:是一个空终止的字符指针数组。

    让我们看一个小例子,展示如何在C中使用execvp()函数。我们将有两个.C文件, EXEC.cexecDemo.c,并通过调用execvp()将EXED.c替换为execDemo.c。 execDemo.c中的函数。

    //EXEC.c
      
    #include
    #include
      
    int main()
    {
        int i;
          
        printf("I am EXEC.c called by execvp() ");
        printf("\n");
          
        return 0;
    }
    

    现在,使用命令创建EXEC.c的可执行文件

    gcc EXEC.c -o EXEC
    //execDemo.c
      
    #include
    #include
    #include
    int main()
    {
            //A null terminated array of character 
            //pointers
            char *args[]={"./EXEC",NULL};
            execvp(args[0],args);
          
            /*All statements are ignored after execvp() call as this whole 
            process(execDemo.c) is replaced by another process (EXEC.c)
            */
            printf("Ending-----");
          
        return 0;
    }
    

    现在,使用命令创建execDemo.c的可执行文件。

    gcc execDemo.c -o execDemo

    使用命令./excDemo运行execDemo.c的可执行文件后,我们得到以下输出:

    I AM EXEC.c called by execvp()
    

    编译文件execDemo.c时,一旦执行execvp(args [0],args)语句,该程序便被程序EXEC.c替换。之所以不会打印“ Ending-–”,是因为因为一旦调用execvp()函数,该程序就会被程序EXEC.c取代。

  • execv :就语法而言,这也与execvp()函数非常相似。 execv()的语法如下所示:语法:
    int execv(const char *path, char *const argv[]);

    路径:应指向正在执行的文件的路径。
    argv []:是一个空终止的字符指针数组。

    让我们看一个小例子,展示如何在C语言中使用execv()函数。该例子与上面为execvp()显示的例子相似。我们将有两个.C文件EXEC.cexecDemo.c,并通过调用execDemo.c中的execv()函数将EXEC.c替换为execDemo.c。

    //EXEC.c
      
    #include
    #include
      
    int main()
    {
        int i;
          
        printf("I am EXEC.c called by execv() ");
        printf("\n");
        return 0;
    }
    

    现在,使用命令创建EXEC.c的可执行文件

    gcc EXEC.c -o EXEC
    //execDemo.c
      
    #include
    #include
    #include
    int main()
    {
            //A null terminated array of character 
            //pointers
            char *args[]={"./EXEC",NULL};
            execv(args[0],args);
          
            /*All statements are ignored after execvp() call as this whole 
            process(execDemo.c) is replaced by another process (EXEC.c)
            */
            printf("Ending-----");
          
        return 0;
    }
    

    现在,使用命令创建execDemo.c的可执行文件。

    gcc execDemo.c -o execDemo

    使用./excDemo命令运行execDemo.c的可执行文件后,我们得到以下输出:

    I AM EXEC.c called by execv()
    
  • execlp和execl :这两个也有相同的用途,但是它们的语法略有不同,如下所示:语法:
    int execlp(const char *file, const char *arg,.../* (char  *) NULL */);
    int execl(const char *path, const char *arg,.../* (char  *) NULL */);
    

    文件:与正在执行的文件关联的文件名
    const char * arg和省略号:描述一个或多个指向以空字符结尾的字符串的指针的列表,这些字符串表示可用于执行的程序的参数列表。

    上面显示的相同C程序可以使用execlp()或execl()函数执行,它们将执行相同的任务,即用新进程替换当前进程。

  • execvpe和execle :这两个也起着相同的作用,但是它们的语法与上述exec系列的所有成员都略有不同。两者的同义词都显示如下:
    句法:
    int execvpe(const char *file, char *const argv[],char *const envp[]);
    
    Syntax:
    int execle(const char *path, const char *arg, .../*, (char *) NULL, 
    char * const envp[] */);
    

    上面显示的语法与所有上面的exec成员都有一个不同的参数,即
    char * const envp []:允许调用者通过参数envp指定执行程序的环境。
    envp:此参数是指向以null终止的字符串的指针的数组,并且必须以null指针终止。其他功能从调用过程中的外部变量环境获取新过程映像的环境。

参考: exec(3)手册页

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。