2014-02-20 86 views
0

所以我正在寫一個程序,其中參數如下所示C:execvp()和命令行參數

program start emacs file.c 

甚至

program wait 

在本質上,第一個參數(argv [0])是程序名稱,後跟用戶輸入。

在我的代碼中,我調用了execvp。事情是,我不完全確定我在援引正確的論點。

if (pid == 0) { 
        execvp(argv[1], argv); //Line of interest 
        exit(1); 
        } 

是argv [1]並且argv是通過上述功能的正確參數嗎?我看了手冊頁,他們有道理,但對於這種情況可能不正確。 謝謝!

+0

你會從答案中注意到常見主題:'execvp(cmds [n],&cmds [n]);'或者等價的。也就是說,將參數數組的第n個元素作爲第一個參數傳遞給'execvp()',並且將參數數組的第n個元素的地址作爲第二個參數傳遞 - 在您的具體情況下, execvp(argv [1],&argv [1]);'。很明顯,你在技術上沒有義務這麼做(爭論是獨立的),但你需要一個很好的理由來做其他事情。 –

回答

2

在你的主,argv的會是這樣第一個例子:

argv[0] = "program"; 
argv[1] = "start"; 
argv[2] = "emacs"; 
argv[3] = "file.c"; 
argv[4] = NULL; 

在execv要執行的程序「開始」與ARGS「emacs的file.c」,對不對?然後第一個參數應該是argv [1] - 「start」,第二個參數應該是這個字符串的數組:{「start」,「emacs」,「file.c」,NULL}。如果使用argv,則在argv [0]中包含「程序」字符串。

您可以創建一個新的數組和複製這些參數或使用的argv地址[1]是這樣的:

execvp(argv[1], &argv[1]); //Line of interest 
1

唯一可能出現的問題是在argv傳遞給execvp將不匹配argv[1](第一個參數)。否則,它看起來沒問題。

想象一下調用program cat file.txt。在你的程序中,argv將是{"program", "cat", "file.txt", NULL}。然後,在貓中,即使被調用的二進制文件是cat,argv仍然是{"program", "cat", "file.txt", NULL}

由於cat試圖打開並讀取每個參數作爲文件,它將嘗試打開的第一個文件是catargv[1]),這不是所需的行爲。

簡單的解決方案是使用execvp(argv[1], argv+1) - 這實質上是將參數數組左移一個元素。

1

我的理解是,你想利用基於第二命令 - 一個具體的行動行參數(argv[1])。如果第二個參數是'start',你的程序應該啓動名爲argv[2]的可執行文件,其後面提供的參數(對吧?)。在這種情況下,應該爲execvp提供可執行文件名稱(argv[2])[1]和一個參數列表,這些參數按照約定以可執行文件的名稱(argv[2])開頭。

execvp(argv[2], &argv[2])將執行我們在最後一段中描述的內容(假設這是您打算執行的操作)。

[0123]如果您知道,execvp需要2個參數。第一個是文件名;如果指定的文件名不包含斜槓字符(/),execvp將在PATH環境變量(其中包含可執行文件所在的目錄列表)中執行查找以查找可執行文件的完全限定名稱。第二個參數是程序啓動時可用的命令行參數列表。

+0

根據第二個例子,我很確定'argv [1]'是預期的目標可執行文件。 – millinon