1

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

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

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

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

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

4

1 回答 1

1

您可以使用标准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
于 2012-07-01T08:21:08.317 回答