如何解决popen失败时如何解释pclose状态?
我在嵌入式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
输出的状态类似于wait4的输出,并且由于WIFEXITED(ret)
为真,WEXITSTATUS(ret)
是孩子.......
好的,但是那之后对我来说是一次寻宝活动,实际上,我无法解释141
是什么代码。
有人有更准确的信息吗?
解决方法
我无法解释代码141是什么。
摘自man popen我的重点:
popen()函数通过创建管道,分叉并调用外壳程序来打开进程。
来自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。因此,您的外壳将退出状态返回为128 + 13 = 141
。
检查WIFSIGNALED(ret)
和WTERMSIG(ret)
。您可能会发现该孩子已被SIGPIPE终止。
此外,pclose
在这里不太可能失败,但是我会在将其返回值传递给等待宏之前检查其返回值。如果pclose
返回
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。