gpt4 book ai didi

c - 如何在 POSIX-C 中复制 'which' 命令的行为?

转载 作者:太空宇宙 更新时间:2023-11-04 04:01:22 25 4
gpt4 key购买 nike

有没有像 which 命令那样工作的 POSIX 函数?也就是说,我向它传递一个命令名称,它在 $PATH 中查找具有该名称的可执行文件,并返回该命令的绝对路径(如果有)。

更长的解释:我的 POSIX-C 应用程序想要启动一个子进程,其进程可能称为 foobar。我的第一个想法是(忽略我需要 child 的 stdin/stdout/stderr):

 system("which foo && foo || which bar && bar");

我不喜欢这种通用的方法,因为这会将所有关于进程调用的错误插入子进程的退出代码和 stdout/stderr(我需要在我的应用程序中作为二进制流! ).

所以看起来我需要在我的应用程序代码中复制 which 的行为,以找到 foobar 可执行文件。是否有合适的 POSIX 函数,或者您是否有代码片段?

最佳答案

您可以使用标准 fork/exec模式,但只需运行 exec两次。如果exec失败,您尝试使用其他进程。

pid_t pid;
pid = fork();
if (pid < 0)
abort();
if (pid == 0) {
// child process
execlp("foo", "foo", "--flag");
if (errno != ENOENT)
abort();
execlp("bar", "bar", "--bar-flags");
abort();
}
// parent process

这可能是最简单的方法,因为通过捕获来自 exec 的错误代码,您可以找出失败的确切原因(因为 foo 不存在)。

替代方案:您还可以实现 which你自己在 C 中,这可能比调用 which 更烦人,也可能不会。直接。

function which(file)
path = getenv("PATH")
for prefix in path
if access(prefix "/" file, R_OK | X_OK)
return prefix "/" file
end if
end for
return NULL
end function

关于c - 如何在 POSIX-C 中复制 'which' 命令的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11280449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com