如何以编程方式确定程序是否在用户的 PATH 中
How can I programatically determine if a program is in the user's PATH
我有一个应用程序,出于调试目的启动了一个带有日志文件的编辑器。编辑器被设置为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()
或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");
}
相关文章:
- C++如何通过用户输入删除列表元素
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何只允许用户输入正整数
- C++如何计算用户输入的数字中的偶数位数
- 通过for循环使用用户输入填充列表
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 在C++中,我如何接受不同于同一行的用户输入
- 当用户超过按钮点击限制时报告
- Visual C++(VS2017)中用户定义的转换不明确
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 当用户键入分隔符时,停止getline()输入
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- RegGetValue在当前用户下找不到名称
- 如何以编程方式确定程序是否在用户的 PATH 中