【问题标题】:Determine if command is successful/exists c [closed]确定命令是否成功/存在 c [关闭]
【发布时间】:2017-02-22 13:46:22
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • 如果您知道命令的路径,为什么不直接执行stat 看看它是否是可执行文件?
  • CURL 是另一种发送电子邮件的好方法。
  • 调用sendmail 充满了许多安全问题。除此之外,除非您设置正确的标头,否则来自某个随机机器的邮件很可能会被视为垃圾邮件。而且sendmail 并不总是可用(您确实说过路由器)。我建议通过SMTP server 发送邮件。大多数邮件提供商都提供一个。

标签: c bash sendmail


【解决方案1】:

如果您知道 sendmail 的路径,那么根据 cmets,使用 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输出的错误信息。

【讨论】:

  • 如果sendmail 不退出或终止,system 函数将不会返回。
  • @BasileStarynkevitch 如果您从 /dev/null 提供它,它将终止。当您如上所示启动它时,它会尝试从标准输入读取
  • 谢谢。这正是我所需要的。
【解决方案2】:

尝试使用它。如果它在那里,并且你可以执行它,它就会工作。如果不是,则不会,您可以在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。

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 2016-05-23
    • 2017-01-26
    • 1970-01-01
    • 2018-09-15
    • 2017-02-09
    • 2012-09-21
    • 1970-01-01
    相关资源
    最近更新 更多