2012-07-01 37 views
1

是否有一個像which命令一樣工作的POSIX函數?也就是說,我將它傳遞給一個命令名稱,並在$PATH中查找具有該名稱的可執行文件,並返回該命令的絕對路徑(如果有)。如何複製POSIX-C中'which'命令的行爲?

更長的解釋:我的POSIX-C應用程序想要啓動一個子進程,其進程可能被稱爲foobar。我的第一個想法是類似的東西(忽略,我需要孩子的stdin/stdout/stderr):

system("which foo && foo || which bar && bar"); 

我不喜歡這種一般的做法,因爲這猛推關於過程調用的所有錯誤到子進程的退出碼stdout/stderr(我需要在我的應用程序中作爲二進制流!)。

所以看起來我需要複製在我的應用程序代碼的which行爲,定位foobar可執行文件。有沒有合適的POSIX函數,或者你是否有代碼片段?

回答

1

您可以使用標準fork/exec模式,但只需運行exec兩次。如果exec失敗,則嘗試使用其他進程。

pid_t pid; 
pid = fork(); 
if (pid < 0) 
    abort(); 
if (pid == 0) { 
    // child process 
    execlp("foo", "foo", "--flag"); 
    if (errno != ENOENT) 
     abort(); 
    execlp("bar", "bar", "--bar-flags"); 
    abort(); 
} 
// parent process 

這可能是做了,因爲從exec捕獲錯誤代碼的最簡單的方法,你可以找出到底爲什麼會失敗(因爲foo不存在)。

替代方案:您也可以自己實施which C,這可能比也可能不會比直接調用which惱人。

function which(file) 
    path = getenv("PATH") 
    for prefix in path 
     if access(prefix "/" file, R_OK | X_OK) 
      return prefix "/" file 
     end if 
    end for 
    return NULL 
end function