2012-04-15 80 views
1

我搜索了很多,但我仍然沒有答案。我有一個程序通過詢問用戶所需的命令來創建其他進程,然後使用execlp來打開這個新進程。我想知道是否有一個簡單的方法來查看父進程是否執行了該命令,或者如果收到的命令不存在。如何知道給execlp()的命令是否存在?

我有以下代碼:

if (executarComando(comando) != OK) 
    fprintf(stderr,"Nao foi possivel executar esse comando. "); 

其中executarComando是:

int executarComando(char* cmd) { 
if (execlp("xterm", "xterm", "-hold", "-e", cmd, NULL) == ERROR) // error 
    return ERROR; 
return OK; 
} 

回答

1

你的問題是你的execlp總是成功;它運行的是xterm,而不是你傳遞給shell xterm運行的命令。你需要在你的程序和這個shell之間添加某種通信通道,以便你可以回傳成功或失敗。我會做一些像

(command) 99>&- ; echo $? >&99 

替換命令之後,分叉調用execlp前打開一個管道,並在孩子使用dup2創建對應於管道的寫入結束文件描述符號99。現在,您可以通過管道讀回命令的退出狀態。

只希望xterm不會關閉你所有的文件描述符;否則你運氣不好,你必須在文件系統的某個地方做一個臨時前綴(通過mkfifo)才能達到相同的結果。

請注意,數字99是任意的;除了0,1或2以外的任何東西都應該工作。

+0

我還沒有讀到管道,你能解釋一下你的替代品嗎? – 2012-04-18 09:31:08

1

有非同小可的方式;通常使用的慣例是fork() ed孩子將在exec()失敗的特定情況下報告錯誤並且exit(-1)(或exit(255)),並且大多數命令避免將其用於它們自己的失敗模式。

+0

問題是,因爲我使用xterm,execlp永遠不會失敗,它只是使用xterm創建另一個shell,然後在該shell中它說該命令不存在。 – 2012-04-15 22:03:13

+0

它仍然是一樣的東西,一級回來;你不能可靠地在事先沒有引入競爭條件的情況下檢查它,或者可能丟失一些潛在的失敗模式(例如,你不能可靠地驗證'execve()'沒有得到'ENOEXEC'或'ETXTBSY'而沒有實際上在執行'execve()')。 – geekosaur 2012-04-15 22:09:11

相關問題