C++: system(0) Returns 0
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执行的命令的退出状态。
- 如何在c++中使用system()来运行包含空格的python脚本
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 程序在使用 system() 启动另一个可执行文件时停止
- 为什么我的 DeviceInformation 对象没有 System.Devices.InterfaceClassGuid 属性?
- 为什么"using System;"不被视为不良做法?
- C++ 合并字符串以'system'函数错误
- System.AccessViolationException:shared_ptr C# .NET 和 C++ 应用程
- 将 Vcl::Controls::TCaption aka (System::UnicodeString) 转换为 co
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- Python os.system() 返回错误值
- 使用 system() 函数在C++程序中运行 cmd 命令
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- CreateWICTextureFromFile returns E_NOINTERFACE
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- system() 无法运行我的程序,因为空间
- How to recover system gcc compiler on centos 6
- 导出 c++ 函数并使用 c# System.AccessViolationException 中的函数
- C++: system(0) Returns 0