關於execlp 函式及其引數問題

2021-08-20 10:20:44 字數 982 閱讀 9105

在《unix環境高階程式設計》一書中,講到exec函式及其使用,其中有乙個例子,簡單來說就是這樣:

execlp("ls", "ls", "-al", (char *)0);

其輸出結果就跟我們在終端裡輸入ls命令得到的結果一樣。

在說疑問之前,先看函式的定義:

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

其中第乙個引數file指向可執行檔名稱,因為execlp()函式會從系統path路徑中尋找相應命令,所以不需要帶完整路徑;

第二個引數之後就都是傳給可執行檔案的引數,類似main函式的args,只是最後乙個引數必須為空字元指標;

疑問是這樣的,當我們在終端輸入 ls -al 的時候,對應到execlp中應該是 file,arg[0] 或是 file,arg[1] 呢?要完全對應應該輸入ls ls -al,但這又不合法,所以最有可能是file, arg[1],那此時的 arg[0] 又在**,誰給的?

其實這個疑問還是很好解釋的,《unix環境高階程式設計》一書中有提到,當核心起動c程式時會使用乙個exec函式(7.2 main函式 ),而我們也知道,shell執行命令的方式就是fork+exec,所以我們執行ls命令不帶引數並非代表沒有這個引數,argv[0]這個引數系統還是會傳遞給exec函式的,我們可以做個試驗

int main(int num_args, const char* args)

return 0;

}編譯後執行該程式

$./a.out

args[0] = ./a.out

由此可見,我們執行./a.out,本意是指示可執行程式的路徑和名稱(對應execlp中的file指標),看起來不帶引數,但args[0]還是存在;同理我們執行ls,不帶引數,但ls還是能從系統中得到arg[0]這個引數。

至於這個引數是什麼,那是另外一回事了,比如某些shell會將此引數設定為完全的路徑名(8.9 exec函式)。

函式getopt 及其他引數

getopt 用來解析命令列引數 include extern char optarg extern int optind extern int opterro extern int optopt getopt int argc,char argv,char options 按照字串options提...

Python函式可變引數定義及其引數傳遞方式詳解

python函式可變引數定義及其引數傳遞方式詳解 python中 函式不定引數的定義形式如下 1 func args 傳入的引數為以元組形式存在args中,如 def func args print args func 1,2,3 1,2,3 func 1,2,3 這個方式可以直接將乙個列表的所有元...

詳解Python函式可變引數定義及其引數傳遞方式

python函式可變引數定義及其引數傳遞方式詳解 python中 函式不定引數的定義形式如下 1 func args 傳入的引數為以元組形式存在args中,如 def func args print args func 1,2,3 1,2,3 程式設計客棧gt func 1,2,3 這個方式可以直接...