确定命令是否成功/存在c

时间:2017-02-22 05:03:20

标签: c bash sendmail

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

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

提前致谢。

2 个答案:

答案 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:它必须在一次不间断的操作中发生。

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