从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。
任何提示,如何解决?
答案 0 :(得分:1)
由于system
错误导致ECHILD
来电失败。当wait
正在等待但没有待处理的子项时会发生这种情况。可能的原因是您的代码(或您调用的某些代码)已为SIGCHLD
设置了SIG_IGN
的信号处理程序。要对此进行测试,您可以将SIGCHLD
信号处理程序设置为SIG_DFL
,以便在调用system
之前将其恢复为默认信号处理程序。
我不想超越自己,所以检查以上测试是否有效。如果是这样,如果程序是单线程的,则可以考虑将测试用作修复程序,并将信号处理程序恢复为system
完成后设置的内容。但是,实际的解决方法是找出设置信号处理程序的位置和原因,然后判断你想要做些什么。