4

从 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。

任何提示,如何解决?

4

1 回答 1

1

system由于ECHILD错误,您的呼叫失败。这发生在wait等待时,但没有挂起的孩子。造成这种情况的一个可能原因是您的代码(或您调用的某些代码)为 to 设置了信号处理SIGCHLD程序SIG_IGN。要对此进行测试,您可以将SIGCHLD信号处理程序设置为SIG_DFL,以将其恢复为默认信号处理程序,就在您调用system.

我不想走得太远,所以检查一下上面的测试是否有效。如果是这样,如果您的程序是单线程的,您可以考虑使用测试作为修复,并且您将信号处理程序恢复到它在system完成后设置的内容。但是,实际的解决方法是找出信号处理程序的设置位置和原因,然后判断您要对此做什么。

于 2012-06-19T07:58:04.427 回答