当被调用为CGI时,system()始终返回非零值

时间:2012-06-18 14:27:19

标签: c++ linux shell 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

我已经验证了在两种情况下都执行了命令(文件/ tmp / foo已创建),但是通过httpd(mongoose,ARM9,Linux)调用它们会返回-1。

任何提示,如何解决?

1 个答案:

答案 0 :(得分:1)

由于system错误导致ECHILD来电失败。当wait正在等待但没有待处理的子项时会发生这种情况。可能的原因是您的代码(或您调用的某些代码)已为SIGCHLD设置了SIG_IGN的信号处理程序。要对此进行测试,您可以将SIGCHLD信号处理程序设置为SIG_DFL,以便在调用system之前将其恢复为默认信号处理程序。

我不想超越自己,所以检查以上测试是否有效。如果是这样,如果程序是单线程的,则可以考虑将测试用作修复程序,并将信号处理程序恢复为system完成后设置的内容。但是,实际的解决方法是找出设置信号处理程序的位置和原因,然后判断你想要做些什么。