当调用CGI时,system()总是返回非零值

当从cgi调用system()时,它总是返回-1(意思是错误)。 errno被设置为10,ECHILD。

test.cgi包含:

cout << "/bin/true " << system("/bin/true") << endl; cout << "/bin/false " << system("/bin/false") << endl; cout << "/bin/touch /tmp/foo" << system("/bin/touch /tmp/foo") << endl; 

从命令行调用,如./test.cgi返回:

 /bin/true 0 /bin/false 256 /bin/touch /tmp/foo 0 

但是,将其作为来自Web浏览器的链接调用将返回(在可预期的格式错误的标头错误消息之后):

 /bin/true -1 /bin/false -1 /bin/touch /tmp/foo -1 

我已经validation了这两种情况下执行的命令(创build了file / tmp / foo),但是通过httpd(mongoose,ARM9,Linux)调用它们将返回-1。

任何提示,如何解决?

由于ECHILD错误,您的system调用失败。 wait等待时会发生这种情况,但没有挂起的孩子。 一个可能的原因是你的代码(或你调用的一些代码)已经把SIGCHLD的信号处理器设置为SIG_IGN 。 为了测试这个,你可以将SIGCHLD信号处理程序设置为SIG_DFL ,以便在调用system之前将其恢复到默认信号处理程序。

我不想太过于自己,所以检查一下上面的测试是否可行。 如果是这样,如果程序是单线程的,可以考虑使用该测试作为修复,并且将信号处理程序恢复到system完成后设置的内容。 但是,实际的解决办法是找出信号处理程序的位置和原因,然后对你想要做的事情做出判断。