2011-04-16 47 views
2

我試圖輸出'ps'的結果作業,但是我遇到了一些我想要弄清的怪癖。有關參數的execv()怪癖

這正常工作,並顯示PS在外殼輸出:

//Create "ps -u laser" 
int pid_ps = fork(); 
char *argv[1] = {"-u laser"}; 
if (pid_ps == 0) { 
    execv("/bin/ps", argv); 
} 

現在,這是在我的幻燈片給出的格式,而只是給出了「用法:」和「格式是一個或更多的」通知PS時,它的運行:

//Create "ps -u laser" 
int pid_ps = fork(); 
char *argv[2] = {"-u", "laser"}; 
if (pid_ps == 0) { 
    execv("/bin/ps", argv); 
} 

我也試圖把0和NULL的陣列,這是在其他的答案提出的結束,但沒有運氣。

我可能忽略了一些小事,但我對c不太熟悉。任何見解都會被讚賞。

+0

我不確定其中之一是否正確。你確定'char * argv [] = {「-u」,「laser」,NULL};'不起作用? – 2011-04-16 16:37:55

+0

只檢查了一倍,仍然給出了「格式」和「用法」消息。 – lase 2011-04-16 16:48:58

回答

10

使用char *argv[] = {"/bin/ps", "-u", "laser", 0}; - 第一個參數是可執行文件的名稱。

編輯:樣品。

int pid_ps = fork(); 
if (pid_ps == 0) { 
    char *argv[] = {"/bin/ps", "-u", "laser", 0}; 
    execv("/bin/ps", argv); 
} 

上面的代碼片段經過測試和工作。

+0

或者你可以通過'''ps「'作爲'argv [0]';那裏真的不需要完整的路徑名。 – 2011-04-16 16:40:53

+0

出於某種原因,我得到的錯誤沒有完整的路徑名。將程序名和參數放在同一個數組中時,execv也會失敗。 – lase 2011-04-16 16:53:13

+0

@layzrr:用測試的工作示例更新答案 – Erik 2011-04-16 17:01:11