IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育


Linux下多進程編程之exec函數語法及使用實例

分享到:
           

    exec函數族

    1)exec函數族說明

    fork()函數用于創建一個子進程,該子進程幾乎復制了父進程的全部內容,但是,這個新創建的進程如何執行呢?exec函數族就提供了一個在進程中啟動另一個程序執行的方法。它可以根據指定的文件名或目錄名找到可執行文件,并用它來取代原調用進程的數據段、代碼段和堆棧段,在執行完之后,原調用進程的內容除了進程號外,其他全部被新的進程替換了。另外,這里的可執行文件既可以是二進制文件,也可以是Linux下任何可執行的腳本文件。

    在Linux中使用exec函數族主要有兩種情況:
     ● 當進程認為自己不能再為系統和用戶做出任何貢獻時,就可以調用exec函數族中的任意一個函數讓自己重生。
     ● 如果一個進程想執行另一個程序,那么它就可以調用fork()函數新建一個進程,然后調用exec函數族中的任意一個函數,這樣看起來就像通過執行應用程序而產生了一個新進程(這種情況非常普遍)。

    2)exec函數族語法

    實際上,在Linux中并沒有exec()函數,而是有6個以exec開頭的函數,它們之間的語法有細微差別,本書在后面會詳細講解。

    表2列舉了exec函數族的6個成員函數的語法。

表2 exec函數族成員函數語法

所需頭文件 #include <unistd.h>
函數原型 int execl(const char *path, const char *arg, ...)
int execv(const char *path, char *const argv[])
int execle(const char *path, const char *arg, ..., char *const envp[])
int execve(const char *path, char *const argv[], char *const envp[])
int execlp(const char *file, const char *arg, ...)
int execvp(const char *file, char *const argv[])
函數返回值 -1:出錯

    這6個函數在函數名和使用語法的規則上都有細微的區別,下面就從可執行文件查找方式、參數傳遞方式及環境變量這幾個方面進行比較。
     ● 查找方式。讀者可以注意到,表2中的前4個函數的查找方式都是完整的文件目錄路徑,而后兩個函數(也就是以p結尾的兩個函數)可以只給出文件名,系統就會自動按照環境變量“$PATH”所指定的路徑進行查找。
     ● 參數傳遞方式。exec函數族的參數傳遞有兩種方式:一種是逐個列舉的方式,而另一種則是將所有參數整體構造指針數組傳遞。在這里是以函數名的第5位字母來區分的,字母為“l”(list)的表示逐個列舉參數的方式,其語法為const char *arg;字母為“v”(vertor)的表示將所有參數整體構造指針數組傳遞,其語法為char *const argv[]。讀者可以觀察execl()、execle()、execlp()的語法與execv()、execve()、execvp()的區別,它們的具體用法在后面的實例講解中會具體說明。

    這里的參數實際上就是用戶在使用這個可執行文件時所需的全部命令選項字符串(包括該可執行程序命令本身)。要注意的是,這些參數必須以NULL結束。
     ● 環境變量。exec函數族可以默認系統的環境變量,也可以傳入指定的環境變量。這里以“e”(environment)結尾的兩個函數execle()和execve()就可以在envp[]中指定當前進程所使用的環境變量。

    表3再對這6個函數中的函數名和對應語法做了一個小結,主要指出了函數名中每一位所表明的含義,希望讀者結合此表加以記憶。

表3 exec函數名對應含義

前4位 統一為:exec
第5位 l:參數傳遞為逐個列舉方式 execl、execle、execlp
v:參數傳遞為構造指針數組方式 execv、execve、execvp
第6位 e:可傳遞新進程環境變量 execle、execve
p:可執行文件查找方式為文件名 execlp、execvp

    事實上,這6個函數中真正的系統調用只有execve(),其他5個都是庫函數,它們終都會調用execve()這個系統調用。在使用exec函數族時,一定要加上錯誤判斷語句。exec很容易執行失敗,其中常見的原因有:
     ● 找不到文件或路徑,此時errno被設置為ENOENT。
     ● 數組argv和envp忘記用NULL結束,此時errno被設置為EFAUL。
     ● 沒有對應可執行文件的運行權限,此時errno被設置為EACCES。

    3)exec使用實例

    下面的第一個示例說明了如何使用文件名的方式來查找可執行文件,同時使用參數列表的方式。這里用的函數是execlp()。

    /* execlp.c */
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        if (fork() == 0)
        {
            /* 調用execlp()函數,這里相當于調用了“ps –ef”命令 */
            if ((ret = execlp("ps", "ps", "-ef", NULL)) < 0)
            {
                printf("Execlp error\n");
            }
        }
    }

    在該程序中,首先使用fork()函數創建一個子進程,然后在子進程中使用execlp()函數。讀者可以看到,這里的參數列表列出了在shell中使用的命令名和選項,并且當使用文件名進行查找時,系統會在默認的環境變量PATH中尋找該可執行文件。讀者可將編譯后的結果下載到目標板上,運行結果如下:

    $ ./execlp
    PID TTY    Uid    Size    State    Command
    1          root   1832    S        init
    2          root   0       S        [keventd]
    3          root   0       S        [ksoftirqd_CPU0]
    4          root   0       S        [kswapd]
    5          root   0       S        [bdflush]
    6          root   0       S        [kupdated]
    7          root   0       S        [mtdblockd]
    8          root   0       S        [khubd]
    35         root   2104    S        /bin/bash /usr/etc/rc.local
    36         root   2324    S        /bin/bash
    41         root   1364    S        /sbin/inetd
    53         root   14260   S        /Qtopia/qtopia-free-1.7.0/bin/qpe -qws
    54         root   11672   S        quicklauncher
    65         root   0       S        [usb-storage-0]
    66         root   0       S        [scsi_eh_0]
    83         root   2020    R        ps -ef
    $ env
    …
    PATH=/Qtopia/qtopia-free-1.7.0/bin:/usr/bin:/bin:/usr/sbin:/sbin
    …

    此程序的運行結果與在shell中直接輸入命令“ps -ef”是一樣的,當然,在不同系統的不同時刻可能會有不同的結果。

    接下來的示例使用完整的文件目錄來查找對應的可執行文件。注意,目錄必須以“/”開頭,否則將其視為文件名。

    /* execl.c */
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        if (fork() == 0)
        {
            /* 調用execl()函數,注意這里要給出ps程序所在的完整路徑 */
            if (execl("/bin/ps","ps","-ef",NULL) < 0)
            {
                printf("Execl error\n");
            }
        }
    }

    同樣將代碼下載到目標板上運行,運行結果同上例。

    下面的示例利用execle()函數將環境變量添加到新建的子進程中,這里的“env”是查看當前進程環境變量的命令,代碼如下:

    /* execle.c */
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        /* 命令參數列表,必須以NULL結尾 */
        char *envp[]={"PATH=/tmp","USER=david", NULL};

        if (fork() == 0)
        {
            /* 調用execle()函數,注意這里也要指出env的完整路徑 */
            if (execle("/usr/bin/env", "env", NULL, envp) < 0)
            {
                printf("Execle error\n");
            }
        }
    }

    下載到目標板后的運行結果如下:

    $ ./execle
    PATH=/tmp
    USER=sunq

    后一個示例使用execve()函數,通過構造指針數組的方式來傳遞參數,注意參數列表一定要以NULL作為結尾標識符。其代碼如下:

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

    int main()
    {
        /* 命令參數列表,必須以NULL結尾 */
        char *arg[] = {"env", NULL};
        char *envp[] = {"PATH=/tmp", "USER=david", NULL};

        if (fork() == 0)
        {
            if (execve("/usr/bin/env", arg, envp) < 0)
            {
                printf("Execve error\n");
            }
        }
    }

    下載到目標板后的運行結果如下:

    $ ./execve
    PATH=/tmp
    USER=david

    本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》

   熱點鏈接:

   1、Linux下多進程編程之fork()函數語法
   2、Linux下多進程編程之fork()函數說明
   3、Linux下多任務系統之線程介紹
   4、Linux下進程的內存結構
   5、Linux下進程的創建、執行和終止

更多新聞>> 

主站蜘蛛池模板: 南京文化墙设计公司,南京包装设计制作印刷,南京PPT设计公司,导视制作公司,企业logo设计 | 上海瀚广科技(集团)有限公司,上海瀚广,瀚广 | 热泵烘干机_食品烘干机_水果烘干机_蔬菜烘干机_河南蓝天机械制造有限公司 | 冷却特性测试仪_ 刀柄热胀仪_加油小车价格_皮带张力仪_上海川奇机电设备有限公司 | 真空泵维修保养-真空泵-真空泵油-真空泵过滤器-真空泵碳片-东莞市海扬真空设备有限公司 | 硫化剂|双马树脂|交联剂-宿迁志晟科技有限公司 | 煤炭烘干机|煤泥烘干机|矿泥烘干机|酒糟烘干机|果渣烘干机-东鼎干燥官方网站 | 助乐邦轮椅,北京轮椅置换,电动轮椅置换,轮椅回收北京,轮椅送货上门服务 | 盐城市城镇化建设投资集团有限公司[盐城国资企业、盐城国资集团、盐城文化旅游、盐城基础设施、盐城土地开发、盐城粮食收储] | 欧洲_西班牙进口_燃木真火壁炉集成服务商_燃木壁炉官方网站.hergom | 上饶环亚电脑会计培训学校--电脑学校|上饶电脑学校|上饶电脑培训|会计培训|上饶会计培训|上饶县会计培训|广丰会计培训|玉山会计培训|横峰会计培训|上饶网店培训 上进电缆(嘉兴)股份有限公司官网 - 光伏电缆|防火电缆|电力电缆|铝合金电缆专业生产厂家 | 石家庄华龙鼎电动门,石家庄电动门电话,石家庄电动门配件,石家庄电动门维修电话,石家庄电动门安装电话,石家庄华龙电动门 | 新颖科技 - 家电及汽车外饰面板供应商 | 中国气象数据_天气数据接口_天气实况api-气象大数据平台 | 铸造厂-铸铝-铸铜-铝合金铸造-重力铸造-翻砂铸造-[剑锋机械配件]专业东莞|深圳铸造厂 | 碳化钨涂层_碳化钨喷涂_碳化钨焊条_碳化钨合金块-北京耐默 | 石家庄LED显示屏|石家庄显示屏|河北显示屏升级改造|石家庄科航光电科技有限公司_石家庄科航光电科技有限公司 | 环球医网 | 带来健康生活...| 友信京泰-操作台-调度台-控制台-监控台定制厂家 | 郑州长城冶金设备有限公司| 青岛除甲醛公司|青岛甲醛治理|青岛除甲醛|甲醛检测|光触媒除甲醛|装修除味除甲醛|新房除甲醛|青岛室内环境污染检测治理|青岛闪洁环保科技有限公司官网 | 南洋电缆_南洋电线电缆_广州南洋电缆集团有限公司 | 万彩办公大师官网-免费的办公工具百宝箱OfficeBox,绿色无广告无捆绑 | 自动门、旋转门、速通门维修保养升级服务平台_门道佰分佰【官网】 | 上海浩斌信息科技有限公司RFID读写器,IC卡读卡器,手持机,数据采集终端,电力仓库管理软件开发,固定资产软件,纱管标签,试剂管理,RFID试剂柜,档案管理,档案柜,智能货架 | 葫芦岛装修公司,兴城装修家装公司,葫芦岛鑫昕装饰 | 智慧环保大数据云平台_车载走航式扬尘/恶臭/噪声污染源在线监测管控信息系统平台_环保土壤/环境监测系统云平台-奥斯恩智能科技 | 惠声电子、广州市惠声电子科技有限公司、VBS、VBS惠声电子、VBS公共广播生产厂家、VBS广播功放生产厂家、VBS会议系统设备批发、VBSIP网络对讲系统厂家、VBS会议系统厂家、VBS智能中控厂家、VBS专业扩声厂家 | 武汉凯美隆窗帘厂家_定做商用窗帘_家用遮阳帘_涵盖电动窗帘_天棚帘_遮阳棚_凯美隆-专注遮阳产品 武汉净化机-武汉全热新风换气机-武汉静音送风机-武汉东信新风节能设备有限公司 | 阻抗分析仪 阻抗测试仪 介电常数测试仪 充电枪测试仪-苏州腾斯凯电子科技有限公司 | 聚合氯化铝pac-聚氯化铝-饮水级工业级聚合氯化铝-聚合氯化铝厂家价格 | 立式加工中心_龙门加工中心_卧式加工中心-山东威达重工股份有限公司 | 无锡市恒威工业气体有限公司-工业高纯气体_高纯度特种气体 | 专业的展会信息服务平台 - 展加 专题秀_汇聚网络热门专题_实时报道各类新闻专题资讯 | -盐城市精工阀门有限公司| 长沙变频器维修,变频器维修,ABB变频器维修,西门子变频器维修,施耐德变频器维修,伺服驱动器维修,工业机器人维修,20年专业工控电气维修,长沙文铖电气设备有限公司_长沙文铖电气设备有限公司 | 耐磨颗粒胶_陶瓷颗粒胶_大小颗粒耐磨胶_耐磨防护胶-北京耐默 | 青山套筒_直螺纹钢筋连接套筒加工_全灌浆套筒灌浆料_半灌浆套筒生产-衡水安达机械设备有限公司 | 全铝家居_十大全铝家具品牌_全铝衣柜橱柜——佛山欧格美铝业 | 全自动清洗过滤器_网式盘式过滤器_石英砂过滤器_叠片过滤器-湖南多灵过滤系统科技有限公司 | 曲阜市好博医疗器械有限公司_手术无影灯厂家,电动手术台出售,妇科手术台价格 |