确定命令是否为 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:它必须在一个不间断的操作中发生。
尽可能避免 popen
和 system
。他们 运行 通过 shell 命令,这会引发安全漏洞和非字母数字字符的意外后果。相反,使用 exec[lv]p
函数之一搜索 PATH
可执行文件而不调用 shell.
如何确定命令是否成功或存在于 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:它必须在一个不间断的操作中发生。
尽可能避免 popen
和 system
。他们 运行 通过 shell 命令,这会引发安全漏洞和非字母数字字符的意外后果。相反,使用 exec[lv]p
函数之一搜索 PATH
可执行文件而不调用 shell.