确定命令是否为 successful/exists c

Determine if command is successful/exists c

如何确定命令是否成功或存在于 C 中?这个会需要兼容多种架构和路由器(别问哈哈)

我正在考虑使用 popen 或 system 或 exec(v)(l)。但是我要检查的命令是 sendmail。由于 sendmail 是一个永远运行而没有输出的命令,这将有点难以做到。有什么想法吗?

提前致谢。

如果您知道 sendmail 的路径,那么根据注释,使用 stat 检查它是否存在以及是否可执行。如果您知道搜索路径,则遍历它并检查每一个。

如果不是 - 您可以将它 /dev/null 作为标准输入传递,在这种情况下它将打印错误消息并退出。然后您可以检查进程的退出代码 - 对于 POSIX 系统,如果无法执行命令,退出代码将为 127:

int rc = system("sendmail </dev/null 2>/dev/null");
if (WEXITSTATUS(rc)!=127) {
    /* sendmail was found */
}

当然这需要 /dev/null 存在并且 shell 重定向可用。

我也重定向了 stderr,否则你会收到 sendmail 输出的错误消息。

只是尝试使用它。如果它在那里,并且您可以执行它,它就会起作用。如果不是,则不会,您可以在 errno.

中了解原因

您不尝试事先检查的原因有两个,文件和可执行文件都一样。首先,您可能会弄错支票。很多人会错误地检查一个文件 是否存在 然后想知道为什么打开它失败。他们忘记检查它是否可读。无需重复所有这些检查,只需尝试打开它并查看。

第二个是它邀请了一个race condition。例如,假设您有两个进程处理同一个文件。时间在往下走。

Process 1                              Process 2
Check if file is readable.
It's readable!
                                       Make the file unreadable.
Open that file.
File fails to open.

这是一个非常简单的例子,竞争条件的后果要严重得多。它说明了检查资源是否可以使用和使用该资源必须 atomic:它必须在一个不间断的操作中发生。


尽可能避免 popensystem。他们 运行 通过 shell 命令,这会引发安全漏洞和非字母数字字符的意外后果。相反,使用 exec[lv]p 函数之一搜索 PATH 可执行文件而不调用 shell.