System()调用返回255,但之后执行

时间:2013-08-19 16:21:28

标签: c++ shell system-calls qnx mongoose-web-server

我在qnx系统上运行mongoose 3.7服务器。

我收到http请求以升级固件。根据请求,我在请求处理程序中使用system()调用来升级固件。

但是,奇怪的是,system()返回255.同样的调用之前使用的是mongoose 2.0。

更奇怪的是,我通过system()调用发出的命令在返回255之后有效。

我正在使用WEXITSTATUS来了解system()返回的错误

知道为什么会这样吗?

1 个答案:

答案 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()的有效退货状态。

我暂时只是评论了这一行。它正在发挥作用。