【问题标题】:how to interpret pclose() status when popen() fails?popen() 失败时如何解释 pclose() 状态?
【发布时间】:2020-09-08 15:10:07
【问题描述】:

我在嵌入式 linux (busybox) 上运行的应用程序尝试通过 popen(cmd, "r") 执行脚本。
cmd = "sh /tmp/DF1_05/update.sh DF1_05"

我可以毫无问题地从 sh 手动启动这个脚本,但是当它被应用程序启动时它会失败。
update.sh 脚本的第一行是:

#!/bin/sh
echo "Starting update script"
....

我什至看不到echo 输出。

我的应用程序代码是:

sprintf(cmd,"sh /tmp/%s/update.sh %s",version_ihm_usb,version_ihm_usb);
printf("Executing script %s\n", cmd);
pipe_cmd = popen(cmd,"r");
if (pipe_cmd != NULL) {
    int ret = pclose(pipe_cmd);
    printf("pclose returned %d:%d,%d\n", ret, WIFEXITED(ret), WEXITSTATUS(ret));
    return 0;
} else {
    printf("Error executing script : %s\n", strerror(errno));
}

应用程序输出为:

Executing script sh /tmp/DF1_05/update.sh DF1_05
pclose returned 36096:1,141

所以根据popen man pagepclose 输出的状态类似于wait4 输出的状态,当WIFEXITED(ret) 为真时,WEXITSTATUS(ret) 是孩子的输出状态.......
好的,但在那之后对我来说这是一次寻宝,事实上,我无法解释 141 是什么代码。

谁有更准确的信息?

【问题讨论】:

  • 在交互式 shell 中手动运行 sh /tmp/%s/update.sh %s 并在完成后检查 echo $?
  • 您看不到echo,因为您必须从pipe_cmd 文件中读取它。您可以通过将set -x 放入其中(或将其称为sh -x /tmp/...)来调试您的脚本;在这种情况下,输出出现在 stderr 上
  • 好的,感谢你们两位,以更好的方式管理输出帮助我找到了问题。

标签: c linux popen busybox


【解决方案1】:

我无法解释代码 141 是什么。

来自man popen强调我的:

popen() 函数通过创建管道、分叉和​​调用 shell 来打开一个进程。

来自bash manual,这是一个常见的约定:

当命令在编号为 N 的致命信号上终止时,Bash 使用值 128+N 作为退出状态。

来自man signal

   Signal        x86/ARM     Alpha/   MIPS   PARISC   Notes
               most others   SPARC
   ─────────────────────────────────────────────────────────────────
   SIGHUP           1           1       1       1
   .... other signals ....
   SIGPIPE         13          13      13      13

进程被SIGPIPE 终止。 SIGPIPE 在您的系统上是 13。所以你的 shell 返回了退出状态为128 + 13 = 141

【讨论】:

    【解决方案2】:

    检查WIFSIGNALED(ret)WTERMSIG(ret)。您可能会发现孩子被 SIGPIPE 终止。

    另外,pclose 在这里不太可能失败,但我会在将其传递给等待宏之前检查它的返回值。如果pclose 返回

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多