1

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

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

4

3 回答 3

3

在手册中查看这些功能

char *getenv(const char *name);

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

openfopen

于 2013-01-31T19:02:13.643 回答
0

您可以使用execlp启动编辑器,它会在当前环境的PATH. 它还会在失败时设置errnoENOENT(“没有这样的文件或目录”),因此您可以捕获不存在的编辑器条件。

char *editor = getenv ("EDITOR");
if(execlp(editor, "foo.txt", (char *) 0))
    perror("Error launching editor");
于 2013-01-31T19:21:40.407 回答
0

我假设您正在申请fork()orforkpty()后跟execlp()or 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");
}
于 2013-01-31T19:28:48.917 回答