C ++:system(0)返回0

时间:2012-01-31 13:28:21

标签: c++ shell system

当我调用 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);

我用它来“处理”僵尸。我刚发现这导致了错误。

2 个答案:

答案 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执行的命令的退出状态。