我在qnx系统上运行mongoose 3.7服务器。
我收到http请求以升级固件。根据请求,我在请求处理程序中使用system()
调用来升级固件。
但是,奇怪的是,system()
返回255.同样的调用之前使用的是mongoose 2.0。
更奇怪的是,我通过system()
调用发出的命令在返回255之后有效。
我正在使用WEXITSTATUS
来了解system()
返回的错误
知道为什么会这样吗?
答案 0 :(得分:3)
我发现了这个问题..
问题是发出system()命令的mongoose回调线程不会等待返回状态,因为这行:
在启动服务器线程的mg_start()函数中,它们包含以下行:
mg_start()
第5159行:
(void) signal(SIGCHLD, SIG_IGN);
他们这样做是为了不创建僵尸进程。
参考:http://www.win.tue.nl/~aeb/linux/lk/lk-5.html
但是,根据QNX文档,
“将信号操作设置为
SIG_IGN
以查找待处理的信号 导致待处理信号被丢弃,无论是否 受阻。如果进程将SIGCHLD
信号的操作设置为SIG_IGN
,行为未指定。“
在SIG_IGN
上调用SIGCHLD
会导致父进程忽略来自子进程的状态信号。
当我们进行system()
调用时,它会阻止正在启动的shell的SIGCHLD信号。根据UNIX文档:
“在等待孩子终止时阻止
SIGCHLD
阻止 从捕获信号和获取状态的应用程序 system {)在system()
之前的子进程可以获得状态。“
但是,由于猫鼬丢弃信号,它不会等待来自system()
的信号。
它只是继续提供响应而没有来自system()
的有效退货状态。
我暂时只是评论了这一行。它正在发挥作用。