2017-05-26 41 views
0

在UNIX環境下的系統編程環境下,在使用編程語言C++的同時,在我的理解中,execl()將傳遞它將運行的程序的路徑和一個向量。當這個向量被傳入時,我理解它被傳遞到入口點,這通常是主要功能。在主函數中,我明白我的參數可以寫爲:execl()的參數傳遞給哪裏?

int main(int argc, int* argv[]){ return 0; } 

考慮到上述背景下,當參數被傳遞到execl的(),在我看來,它並沒有得到直接傳入主函數。

是否有一個「處理」階段的execl()的參數更改爲整數數據類型和數組?

同時,如果我的理解有任何問題,請隨時糾正。

+2

你聲稱的主要特徵是錯誤的,ITT的總是'INT主(INT ARGC,CHAR * argv []){return 0; }' –

回答

3

您爲main函數提供的簽名不正確。它應該是:

int main(int argc, char *argv[]); 

或者:

int main(void); 

至於參數,傳遞給execl的參數應與被調用的程序接收到什麼。

例如,如果節目A高層程序這樣B:

execl("/path/to/progB", "progB", "-a", "1", "-x", "hello", "command", (char *)NULL); 

然後在程序B中,argc將6和argv將基本上是:

{ "progB", "-a", "1", "-x", "hello", "command" } 
+1

不要忘了施放'NULL'(char *)NULL' –

+0

@SeekAddo好。編輯。 – dbush

1

main需要char*argv[]參數(不是int *argv[])就像通常的核心執行sysccall通常一樣。在Linux上,系統調用是execve(需要一個char*[])並且所有其他exec *函數都是以這種方式實現的。

至於execl,參數列表需要以NULL結尾,它允許您計算參數,然後將它們複製到傳遞到execve的數組中。

的MUSL libc庫的確是相當直截了當:https://git.musl-libc.org/cgit/musl/tree/src/process/execl.c

1

你的理解是錯誤的。從這個documentation參數列表始終是一些空值終止char*指針(重點煤礦):

execl(<shell path>, arg0, file, arg1, ..., (char *)0);

其中,是SH公用未指定的路徑,文件是>>過程圖像文件和execvp(),其中arg0,arg1等與傳遞給argv [0],argv [1]等中的execvp()的值相對應。

由arg0,...表示的參數是指向以空字符結尾的字符串的指針。這些字符串應構成可用於新過程映像的參數列表。該列表由空指針終止。參數arg0應該指向與某個exec函數啓動的進程關聯的文件名字符串。

所以不符合你自稱什麼:

int main(int argc, int* argv[]){ return 0; } 
       // ^^^^