popen() 失败时如何解释 pclose() 状态?
how to interpret pclose() status when popen() fails?
我在嵌入式 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 page, pclose
outputs a status similar to what wait4输出,由于WIFEXITED(ret)
为真,WEXITSTATUS(ret)
是child的输出状态......
好的,但在那之后对我来说就是一次寻宝,事实上,我无法解释代码 141
是什么。
有没有人有更准确的信息?
检查 WIFSIGNALED(ret)
和 WTERMSIG(ret)
。您可能会发现 child 被 SIGPIPE 终止。
此外,pclose
不太可能在这里失败,但我会在将其传递给等待宏之前检查它的 return 值。如果 pclose
returns < 0,记录错误。
I cannot interpret what code 141 is.
来自 man popen 强调我的:
The popen() function opens a process by creating a pipe, forking, and invoking the shell.
来自bash manual,这是一个常见的约定:
When a command terminates on a fatal signal whose number is N, Bash uses the value 128+N as the exit status.
来自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
。
我在嵌入式 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 page, pclose
outputs a status similar to what wait4输出,由于WIFEXITED(ret)
为真,WEXITSTATUS(ret)
是child的输出状态......
好的,但在那之后对我来说就是一次寻宝,事实上,我无法解释代码 141
是什么。
有没有人有更准确的信息?
检查 WIFSIGNALED(ret)
和 WTERMSIG(ret)
。您可能会发现 child 被 SIGPIPE 终止。
此外,pclose
不太可能在这里失败,但我会在将其传递给等待宏之前检查它的 return 值。如果 pclose
returns < 0,记录错误。
I cannot interpret what code 141 is.
来自 man popen 强调我的:
The popen() function opens a process by creating a pipe, forking, and invoking the shell.
来自bash manual,这是一个常见的约定:
When a command terminates on a fatal signal whose number is N, Bash uses the value 128+N as the exit status.
来自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
。