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

How can I programatically determine if a program is in the user's PATH

本文关键字:用户 PATH 是否 程序 编程 方式确      更新时间:2023-10-16

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

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

在手册中查看这些函数

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

openfopen

您可以使用

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

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

我假设您正在应用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");
}