【问题标题】:the difference behaviour in popen and pclosepopen 和 pclose 的不同行为
【发布时间】:2013-12-16 09:32:05
【问题描述】:

最近,我在使用popen(3)pclose(3) 时遇到了一个奇怪的问题。就像这样:

//a.sh
#!/bin/bash
cat /etc/issue
sleep 3

//b.sh
#!/bin/bash
cat /etc/issue
echo "before sleep"
sleep 3

我的 C 程序:

#include <stdio.h>
int main(void) {
1:    FILE *fl = popen("sh a.sh", "r");
2:    FILE *fl = popen("sh b.sh", "r");
      int t = pclose(fl);
      printf("%d\n", t);
      return 0;
}  

接下来,我将编译和运行这个程序,分为 4 个步骤:

case 1:注释第2行,然后编译运行,程序不打印0,直到shell cmd终止。

case 2:注释第1行,然后编译运行,程序立即终止,打印13,也就是说pclose的退出状态是13,我查了linux errno:

13 EACCES +Permission denied

有人会帮助我并告诉我原因吗?谢谢。

【问题讨论】:

  • pclose 返回子进程的退出状态,而不是errno.h 错误值。
  • 谢谢,我将使用 WEXITSTATUS 宏和 WIFEXITED 宏

标签: c linux


【解决方案1】:

您应该使用WEXITSTATUS 宏来获取真正的返回码。

【讨论】:

  • 谢谢。我使用WEXITSTATUS宏,它返回0。这是否表明plose是正确的?但是,为什么它不等待 shell 终止呢?
  • 你也用过WIFEXITED吗?请阅读 W... 宏的完整手册页:linux.die.net/man/2/wait
  • 同意,您应该显示所有 W.. 宏的返回,以获取有关您的子进程的更多信息。
猜你喜欢
  • 2011-10-25
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 2019-02-12
相关资源
最近更新 更多