C++: system(0) Returns 0



当我调用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说没有子进程

我还编译了另一个测试程序,它什么都不做,只调用system(0),它返回非零值。它会受到代码::块的影响吗?

编辑

到目前为止,我已经发现系统(0)只有在我开始第一次pthread后才会失败。

已解决

我在早期实现这段代码时使用了fork

signal(SIGCHLD,SIG_IGN);

我用它来"对付"僵尸。我刚刚发现这是导致错误的原因。

如果使用以下代码忽略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(例如fork(2)失败),否则为命令的返回状态。后一种返回状态采用等待(2)中指定的格式。因此,命令的退出代码将是WEXITSTATUS(状态)。如果/bin/sh无法执行,则退出状态将是退出的命令的状态(127)。如果命令的值为NULL,那么如果shell可用,system()将返回非零,如果不可用,则返回零。

如果路径中没有sh或不是可执行文件,则不可用。检查您的配置。

如果系统返回-1,则可能是执行fork时出现问题,因此请检查errno变量值或调用命令的返回状态,也可能是-1。验证从chell执行的命令的退出状态。

最新更新