如何确定命令是否成功或存在于C中?这需要与多个架构和路由器兼容(不要问哈哈)
我正在考虑使用popen或system或exec(v)(l)。但我要检查的命令是sendmail。由于sendmail是一个永远运行而没有输出的命令,因此这有点难。有什么想法吗?
提前致谢。
答案 0 :(得分:1)
如果您知道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输出错误信息。
答案 1 :(得分:0)
试着用它。如果它在那里,你可以执行它,它会工作。如果不是,则不会,您可以在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。