我有一个应用程序,出于调试目的,启动带有日志文件的编辑器。编辑被设置为kedit。 RedHat发布更新后,我们不再使用kedit了。我们只是更改了默认编辑器并添加了一个环境变量,让用户选择他们喜欢的编辑器。
问题在于,如果用户将环境变量设置为不存在或不存在的编辑器,则不会发生任何事情。我想看看编辑是否存在,如果没有通知他们。有没有办法在C ++中做到这一点?
答案 0 :(得分:3)
查看手册中的这些功能
char *getenv(const char *name);
int stat(const char *path, struct stat *buf);
或open
和fopen
答案 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");
}