2013-01-31 106 views
1

我有一個應用程序用於調試目的啓動帶有日誌文件的編輯器。編輯被設置爲kedit。 RedHat發佈更新後,我們不再有kedit。我們只是改變了默認編輯器,並添加了一個環境變量,讓用戶選擇他們喜歡的編輯器。如何以編程方式確定程序是否在用戶的路徑中

問題是,如果用戶將環境變量設置爲不存在或不是它們的路徑的編輯器,則什麼都不會發生。我想看看編輯是否存在,如果不通知他們。有沒有辦法在C++中做到這一點?

+0

您可以遍歷'$ PATH'的組件並檢查文件'/binary_name'是否存在。 – 2013-01-31 18:53:44

+0

如果你只在linux上運行,你可以使用'which'。當二進制文件被找到時返回'0',否則返回'1'。 (見'man 1 which') – us2012

+1

'system(「which $ {EDITOR}」)'? –

回答

3

查閱這些功能在手動

char *getenv(const char *name); 

int stat(const char *path, struct stat *buf); 

openfopen

+0

我對它們都很熟悉,但是,我希望找到一個不需要我解析'$ PATH'的答案,在每個條目上循環,然後統計編輯器來驗證它是否存在。我希望已經有這樣做了。 – steveo225

+0

我最終確實循環遍歷每個'$ PATH'條目和'stat'編輯器檢查是否存在 – steveo225

0

您可以使用execlp啓動編輯器,它會搜索當前環境的PATH。它也設置errnoENOENT(「沒有這樣的文件或目錄」),因此您可以捕獲不存在的編輯器條件。

char *editor = getenv ("EDITOR"); 
if(execlp(editor, "foo.txt", (char *) 0)) 
    perror("Error launching editor"); 
+1

應該是'execlp(編輯器,編輯器,「foo.txt」,(char *)0);' – jxh

+0

已更新回答... – jman

0

我假設你被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"); 
} 
相關問題