【问题标题】:How to tell if popen() was successful?如何判断 popen() 是否成功?
【发布时间】:2012-01-24 19:28:52
【问题描述】:

你怎么知道popen()是成功/完成运行shell还是失败?

【问题讨论】:

  • “运行 shell”是什么意思?你检查过弹出的手册页吗?
  • Documentation... "成功完成后,popen() 应返回一个指向打开的流的指针,该流可用于读取或写入管道。否则,它应返回一个空指针并可能设置 errno 以指示错误"
  • 检查manual page
  • @user1104856,“成功”对您意味着什么?我可以看到三种情况:(1)程序完全成功运行,成功退出状态为0,或(2)cat non_existent_file,或(3)更灾难性的失败,popen 甚至无法调用 fork 或 pipe .

标签: c++ c shell popen


【解决方案1】:

popen return value:

成功完成后,popen() 将返回一个指向打开的指针 可用于读取或写入管道的流。否则,它 应该返回一个空指针,并且可以设置 errno 来指示错误。

fp = popen("ls *", "r");
if (fp == NULL)
    /* Handle error */;

【讨论】:

  • 谢谢!正是我需要知道的:D
  • 您可以通过阅读手册页 man popen 找到的内容。通过在此处询问之前检查您当地的文档,您将来会为自己(以及我们其他人)节省大量时间。
  • 请记住,shell 运行的命令可能会失败,可能是试图cat 一个不存在的文件。在这种情况下,popen 是成功的。您需要使用 pclose 从 shell 获取返回值。
  • @ Keith Thompson 我做到了,但你是对的。 @Aaron McDaid 我这样做了:status = pclose(fp); :)
  • @AaronMcDaid - 那么如果我需要在关闭流之前检查 shell 的返回码怎么办?
【解决方案2】:

假设您的意思是在 C 代码中运行 popen,您可以查看手册页。它表示如果失败,popen 将返回 NULL,否则返回文件流。

【讨论】:

    【解决方案3】:

    接受的答案并不是真正确定的。

    例如,要求popen() 执行无效的命令或图像只会返回一个有效的文件指针(没有可读取的内容)。同时,来自 shell 的错误消息被重定向到父级的stderr

    popen() 在无法生成 shell 时确实会返回 NULL,这在通常情况下是一种不寻常的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多