如何以编程方式确定程序是否在用户的PATH中

时间:2013-01-31 18:50:15

标签: c++

我有一个应用程序,出于调试目的,启动带有日志文件的编辑器。编辑被设置为kedit。 RedHat发布更新后,我们不再使用kedit了。我们只是更改了默认编辑器并添加了一个环境变量,让用户选择他们喜欢的编辑器。

问题在于,如果用户将环境变量设置为不存在或不存在的编辑器,则不会发生任何事情。我想看看编辑是否存在,如果没有通知他们。有没有办法在C ++中做到这一点?

3 个答案:

答案 0 :(得分:3)

查看手册中的这些功能

char *getenv(const char *name);

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

openfopen

答案 1 :(得分:0)

您可以使用execlp启动编辑器,它会在当前环境中搜索PATH。它还会在失败时将errno设置为ENOENT(“没有这样的文件或目录”),这样您就可以捕获不存在的编辑器条件。

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

答案 2 :(得分:0)

我假设您正在应用fork()forkpty(),后跟execlp()execvp()。基本上,您只需要检查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");
}