我有一个用于调试目的的应用程序启动一个带有日志文件的编辑器。编辑器设置为 kedit。在 RedHat 版本更新之后,我们不再拥有 kedit。我们只是更改了默认编辑器并添加了一个环境变量,让用户选择他们喜欢的编辑器。
问题是,如果用户将环境变量设置为不存在或不是他们的路径的编辑器,则不会发生任何事情。我想看看编辑器是否存在,如果不存在,请通知他们。有没有办法在 C++ 中做到这一点?
我有一个用于调试目的的应用程序启动一个带有日志文件的编辑器。编辑器设置为 kedit。在 RedHat 版本更新之后,我们不再拥有 kedit。我们只是更改了默认编辑器并添加了一个环境变量,让用户选择他们喜欢的编辑器。
问题是,如果用户将环境变量设置为不存在或不是他们的路径的编辑器,则不会发生任何事情。我想看看编辑器是否存在,如果不存在,请通知他们。有没有办法在 C++ 中做到这一点?
在手册中查看这些功能
char *getenv(const char *name);
int stat(const char *path, struct stat *buf);
或open
和fopen
您可以使用execlp
启动编辑器,它会在当前环境的PATH
. 它还会在失败时设置errno
为ENOENT
(“没有这样的文件或目录”),因此您可以捕获不存在的编辑器条件。
char *editor = getenv ("EDITOR");
if(execlp(editor, "foo.txt", (char *) 0))
perror("Error launching editor");
我假设您正在申请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");
}