日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

5进程原语:execl(),execlp(),execle(),execv(),execvp(),execvp(),execve()

發布時間:2024/9/27 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5进程原语:execl(),execlp(),execle(),execv(),execvp(),execvp(),execve() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


1.exec族依賴的頭文件

#include<unistd.h>

extern char**environ;

2函數聲明

//第一個參數:可執行程序所在的絕對位置

//第二個參數:可執行程序運行時所需的參數,這里是一個可變參數,每個參數之間用逗號分割

//參數結束時,最后一個參數是:NULL

int execl(constchar *path, const char *arg, ...);

?

//注意,這里函數名加了p,表示調用了系統的環境變量中配置的PATH,查看環境變量命令:Echo $PATH

?

//第一個參數:只需要寫上文件名即可,不用寫全路徑,后面的參數和上面的參數相同

int execlp(constchar *file, const char *arg, ...);

?

//第一個參數:全路徑

//envp[],表示傳遞的是環境變量的數組

int execle(constchar *path, const char *arg,

????????????????? ..., char * const envp[]);

?

//這個和第一個exec函數區別是,這里的參數不是可變參數了,而是通過一個傳遞一個數組的方式進行傳遞進去。

int execv(constchar *path, char *const argv[]);

?

//execvpexecv的區別僅僅是文件名和路徑的區別。

int execvp(constchar *file, char *const argv[]);

?

//這時候傳遞環境變量

int execvpe(constchar *file, char *const argv[],

?????????????????? char *const envp[]);

?

3.注意:

?? A:這些函數如果調用成功則加載新的程序從啟動代碼開始執行,不再返回,如果調用出錯則返回-1,所以exec函數只有出錯的返回值而沒有成功的返回值。

?? B: 這些函數原型看起來很容易混,但只要掌握了規律就很好記。不帶字母p(表示

path)的exec函數第一個參數必須是程序的相對路徑或絕對路徑,例如“/bin/ls”或“./

a.out”,而不能是“ls”或“a.out”。對于帶字母p的函數:

如果參數中包含/,則將其視為路徑名。

否則視為不帶路徑的程序名,在PATH環境變量的目錄列表中搜索這個程序。

帶有字母l(表示list)的exec函數要求將新程序的每個命令行參數都當作一個參數傳

給它,命令行參數的個數是可變的,因此函數原型中有…,…中的最后一個可變參數應該是

NULL,起sentinel的作用。對于帶有字母v(表示vector)的函數,則應該先構造一個指向

各參數的指針數組,然后將該數組的首地址當作參數傳給它,數組中的最后一個指針也應該

NULL,就像main函數的argv參數或者環境變量表一樣。

C:對于以e(表示environment)結尾的exec函數,可以把一份新的環境變量表傳給它,其他exec函數仍使用當前的環境變量表執行新程序。

??? D:exec調用舉例如下:

char *const ps_argv[] ={"ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL};

char *const ps_envp[]={"PATH=/bin:/usr/bin", "TERM=console", NULL};

execl("/bin/ps", "ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);

execv("/bin/ps", ps_argv);

execle("/bin/ps", "ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL, ps_envp);

execve("/bin/ps", ps_argv,ps_envp);

execlp("ps", "ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);

execvp("ps", ps_argv);

E: 事實上,只有execve是真正的系統調用,其它五個函數最終都調用execve,所以execveman手冊第2節,其它函數在man手冊第3節。這些函數之間的關系如下圖所示。

?

4.案例說明:

運行結果:

5. 由于exec函數只有錯誤返回值,只要返回了一定是出錯了,所以不需要判斷它的

返回值,直接在后面調用perror即可。注意在調用execlp時傳了兩個“ps”參數,第一

個“ps”是程序名,execlp函數要在PATH環境變量中找到這個程序并執行它,而第二

個“ps”是第一個命令行參數,execlp函數并不關心它的值,只是簡單地把它傳給ps

序,ps程序可以通過main函數的argv[0]取到這個參數。

調用exec后,原來打開的文件描述符仍然是打開的。利用這一點可以實現I/O重定向。

先看一個簡單的例子,把標準輸入轉成大寫然后打印到標準輸出:

運行結果:

運行結果:

分析:

wrapper程序將命令行參數當作文件名打開,將標準輸入重定向到這個文件,然后調用

exec執行upper程序,這時原來打開的文件描述符仍然是打開的,upper程序只負責從標準輸入讀入字符轉成大寫,并不關心標準輸入對應的是文件還是終端。

??? exec

l 命令行參數列表

p 搜素file時使用path變量

v 使用命令行參數數組

e 使用環境變量數組,不使用進程原有的環境變量,設置新加載程序運行的環境變量

?

?

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的5进程原语:execl(),execlp(),execle(),execv(),execvp(),execvp(),execve()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。