zoukankan      html  css  js  c++  java
  • 在进程中执行新代码 execl、execle、execlp、execv、execve和execvp函数

    摘要:本文主要讲述怎样在进程中执行新代码,以及exec系列函数的基本用法.

    在进程中执行新代码

        用函数fork创建子进程后,假设希望在当前子进程中运行新的程序,能够调用exec函数运行还有一个程序.当进程调用exec函数时,该进程用户空间资源(正文、数据、堆和栈)全然由新程序替代,新程序则从main函数開始运行.由于调用exec函数并没有创建新的进程,所曾经后的进程ID并没有改变,也即内核信息基本不做改动.
        exec系列函数共同拥有7函数可供使用,这些函数的差别在于:指示新程序的位置是使用路径还是文件名称,假设是使用文件名称,则在系统的PATH环境变量所描写叙述的路径中搜索该程序;在使用參数时使用參数列表的方式还是使用argv[]数组的方式.

    1.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[]);
        int fexecve(int fd, char *const argv[]。 char *const envp[]);
    返回值:假设运行成功将不返回,否则返回-1,失败代码存储在errno中.
        前4个函数取路径名作为參数。后两个是取文件名称作为參数。最后一个是以一个文件描写叙述符作为參数.

    2.函数详细分析

        当指定filename作为參数时:
    1)假设filename中包括/,则将其视为路径名.
    2)否则就按PATH环境变量,在它所指的各文件夹搜寻可运行文件.

    2.1 execl()函数

    int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ );
        execl()函数用来运行參数path字符串所指向的程序。第二个及以后的參数代表运行文件时传递的參数列表。最后一个參数必须是空指针以标志參数列表为空.
    样例1:演示exec()函数的基本使用.
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <stdlib.h>
    int main()
    {
            pid_t pid;
            pid = fork();
            if(pid<0)
            {
                    printf("error fork:%m
    ");
                    exit(-1);
            }
            else if(pid==0)
            {
                    //
                    execl("/bin/ls"。"ls","-l"。"/etc",(char *)0);
            }
            else
            {
                    printf("parent process
    ");
            }
            return 0;
    }

    输出:

     

    2.2 execle()函数

    int execle(const char *pathname。 const char *arg0, .../* (char *)0。 char *const envp[] */ );
        execle()函数用来运行參数path字符串所指向的程序,第二个及以后的參数代表运行文件时传递的參数列表,最后一个參数必须指向一个新的环境变量数组。即新运行程序的环境变量.
    样例2:
    #include <unistd.h>
    int main(int argc。 char *argv[], char *env[])
    {
            execle("/bin/ls","ls","-l", "/etc"。(char *)0,env);
            return 0;
    }

    输出:

     

    2.3 execlp()函数

    int execlp(const char *filename, const char *arg0。 ... /* (char *)0 */ );
        execlp()函数会从PATH环境变量所指的文件夹中查找文件名称为第一个參数指示的字符串,找到后运行该文件,第二个及以后的參数代表运行文件时传递的參数列表,最后一个參数必须是空指针.
    样例3:
    #include <unistd.h>
    
    int main()
    {
            execlp("ls"。 "ls"。 "-l", "/etc", (char *)0);
            return 0;
    }

    输出:

     

    2.4 execv()函数

    int execv(const char *path。 char *const argv[]);
        execv()函数函数用来运行參数path字符串所指向的程序,第二个为数组指针维护的程序參数列表。该数组的最后一个成员必须是空指针.
    样例4:
    #include <unistd.h>
    
    int main()
    {
            char *argv[] = {"ls", "-l", "/etc", (char *)0};
            execv("/bin/ls", argv);
            return 0;
    }
    

    输出:

     

    2.5 execvp()函数

    int execvp(const char *file, char *const argv[]);
       execvp()函数会从PATH环境变量所指的文件夹中查找文件名称为第一个參数指示的字符串,找到后运行该文件,第二个及以后的參数代表运行文件时传递的參数列表。最后一个成员必须是空指针.
    样例5:
    #include <unistd.h>
    
    int main()
    {
            char *argv[] = {"ls", "-l"。 "/etc", (char *)0};
            execvp("ls", argv);
            return 0;
    }

    输出:

     
        几个函数之间很相似。没有找到更好的方法记忆,通过简单的样例临时了解一下它们之间的不同调用方式.字母联想也不靠谱:
        字母p表示该函数取filename作为參数,而且用PATH环境变量寻找可运行文件.
        字母l表示该函数取一个參数表。它与字母v相互排斥.
        字母v表示该函数取一个argv[]矢量.
        字母e表示该函数取envp[]数组.

    待续......

    笔者:个人能力有限,仅仅是学习參考...读者若发现文中错误,敬请提出.
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------勿在浮沙筑高台,静下心来。慢慢地沉淀---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  • 相关阅读:
    HDOJ1269 迷宫城堡
    最长公共子序列 nyoj36
    HDU1081 To The Max 求子矩阵最大和
    nyoj20 吝啬的国度
    景观分析工具:arcgis中patch analysis模块
    景观格局动态变化分析方法(基于ArcGIS、Fragstats、ENVI、ERDAS、Patch Analysis for ArcGIS) (20110315 08:07:03)
    从C#到Python —— 谈谈我学习Python一周来的体会
    如何判定多边形是顺时针还是逆时针
    超新星与暗能量的发现--今年诺贝尔物理奖工作的介绍(转)
    怎样把扫描好的身份证打印出实际大小
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6772519.html
Copyright © 2011-2022 走看看