当我调用 system(0)时,它返回0,这意味着 shell不可用。
当使用 system 的命令(调用gcc来编译hello world程序)时,它工作正常但返回-1(我认为它与 system(0)的原因相同返回0)。是什么导致它“不可用”,为什么它仍然有效?
编译器: gcc版本4.6.1(Ubuntu / Linaro 4.6.1-9ubuntu3)
操作系统:Ubuntu 11.10
修改
Errno说 No Child Processes 。
我还编译了另一个测试程序,除了调用 system(0)之外什么都不做,它返回非零值。可以受Code :: Blocks影响吗?
修改
到目前为止,我已经发现 system(0)在我开始第一次pthread后才会失败。
解决
我在早期实现这段代码之一时使用了 fork :
signal(SIGCHLD,SIG_IGN);
我用它来“处理”僵尸。我刚发现这导致了错误。
答案 0 :(得分:3)
如果您使用以下代码忽略SIGCHLD
信号,则可能发生这种情况:
signal(SIGCHLD, SIG_IGN);
这会导致system
在所有孩子都已结束时返回-1
,将errno
设为ECHILD
。
请参阅http://pubs.opengroup.org/onlinepubs/009695399/functions/wait.html。具体来说:
如果调用进程设置了SA_NOCLDWAIT或者SIGCHLD设置为SIG_IGN,并且进程没有被转换为僵尸进程的子进程,则调用线程将阻塞,直到进程的所有子进程都包含调用线程终止,wait()和waitpid()将失败并将errno设置为[ECHILD]。
答案 1 :(得分:1)
男人说:
错误时返回的值为-1(例如fork(2)失败),否则返回命令的返回状态。后一种返回状态采用wait(2)中指定的格式。因此,命令的退出代码将是WEXITSTATUS(状态)。如果无法执行/ bin / sh,则退出状态将是退出(127)的命令的退出状态。如果command的值为NULL,则system()如果shell可用则返回非零值,否则返回零。
如果您的路径中没有sh
或者不是可执行文件,则无法使用。检查您的配置。
如果系统返回-1可能是执行fork
的问题,那么检查errno
变量值或者调用命令的返回状态,也可能是-1。验证从chell执行的命令的退出状态。