我有一個應用程序用於調試目的啓動帶有日誌文件的編輯器。編輯被設置爲kedit。 RedHat發佈更新後,我們不再有kedit。我們只是改變了默認編輯器,並添加了一個環境變量,讓用戶選擇他們喜歡的編輯器。如何以編程方式確定程序是否在用戶的路徑中
問題是,如果用戶將環境變量設置爲不存在或不是它們的路徑的編輯器,則什麼都不會發生。我想看看編輯是否存在,如果不通知他們。有沒有辦法在C++中做到這一點?
我有一個應用程序用於調試目的啓動帶有日誌文件的編輯器。編輯被設置爲kedit。 RedHat發佈更新後,我們不再有kedit。我們只是改變了默認編輯器,並添加了一個環境變量,讓用戶選擇他們喜歡的編輯器。如何以編程方式確定程序是否在用戶的路徑中
問題是,如果用戶將環境變量設置爲不存在或不是它們的路徑的編輯器,則什麼都不會發生。我想看看編輯是否存在,如果不通知他們。有沒有辦法在C++中做到這一點?
我假設你被execlp()
或execvp()
應用fork()
或forkpty()
緊隨其後。基本上,你只需要檢查是否返回exec?p()
(它只會在失敗時返回)。如果是這樣,您只需向您的父級進程發信號通知發生了故障。一種方法是使用exit()
狀態。家長可以通過使用wait()
收穫子進程來捕獲此狀態。
#define EXEC_FAIL_MAGIC 177
void edit (const char *e) {
int status = 0;
pid_t p = fork();
switch (p) {
default: /* parent */
while (wait(&status) != p) {}
break;
case 0: /* child */
execlp(e, e, "foo.txt", (char *)0);
exit(EXEC_FAIL_MAGIC);
case -1: /* error */
fail("fork() failed");
}
if (!WIFEXITED(status)) fail("abnormal termination of editor");
if (WEXITSTATUS(status) == EXEC_FAIL_MAGIC) fail("execlp failed");
if (WEXITSTATUS(status) != EXIT_SUCCESS) fail("editor had failure");
}
您可以遍歷'$ PATH'的組件並檢查文件'/binary_name'是否存在。 –
2013-01-31 18:53:44
如果你只在linux上運行,你可以使用'which'。當二進制文件被找到時返回'0',否則返回'1'。 (見'man 1 which') – us2012
'system(「which $ {EDITOR}」)'? –