【问题标题】:C++: system(0) Returns 0C++:系统(0)返回 0
【发布时间】:2012-02-23 05:13:14
【问题描述】:

当我调用 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) 并返回非零值。会不会受 Code::Blocks 影响?

编辑

到目前为止,我发现 system(0) 只有在我启动第一个 pthread 后才会失败。

已解决

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

signal(SIGCHLD,SIG_IGN);

我用它来“处理”僵尸。我刚刚发现这是导致错误的原因。

【问题讨论】:

  • @Paul : 使用参数system 调用0 基本上是测试shell 是否可用。例如。 “如果 command 是空指针,system() 函数将判断宿主环境是否有命令处理器。”
  • @Sander:谢谢-我不知道-我只是重新阅读了手册页,我发现您是对的!
  • @Paul,来自 system(3) 文档:“如果 command 的值为 NULL,则 system() 如果 shell 可用则返回非零值,否则返回零。”
  • @Pius : errno 在运行 system(your_command) 后设置为什么?
  • 用错误信息更新问题。

标签: c++ shell system


【解决方案1】:

如果您使用以下代码忽略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]。

【讨论】:

  • no unwaited-for -> 我给你的帖子 +1,因为这不是你的错误,但这种表达方式需要大修才能让非母语人士容易理解。
【解决方案2】:

男人说:

错误时返回值为 -1(例如 fork(2) 失败),否则返回命令状态。后一种返回状态采用 wait(2) 中指定的格式。因此,该命令的退出代码将是 WEXITSTATUS(status)。如果 /bin/sh 无法执行,退出状态将是执行 exit(127) 的命令的状态。如果 command 的值为 NULL,则 system() 如果 shell 可用则返回非零值,否则返回零。

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

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

【讨论】:

  • 嗯,我正在执行的命令是 gcc 编译一个 Hello World 程序。它编译得很好并且什么都不输出(尝试了语法错误 - gcc 完成了它的工作并输出了所有内容)。我担心的是shell由于某种原因不可用。通常 system(0) 应该返回非零值。
  • 我不明白你的问题。您正在针对 gcc 执行一个带有 systemsentence 的程序。像system("gcc -o foo foo.cpp") 这样的东西。真的吗?在这种情况下,system 返回 gcc 返回值:如果正常则为 0
  • 是的。但它不返回 0。它为命令调用返回 -1(意味着系统函数失败(但它没有))。我从 system(0) 得到 0,这(手动)意味着 shell 不可用。在 THIS (system(0)) call errno 之后是“No Child Processes”。
  • @Pius,编辑你的问题,添加你的代码并用错误评论它。
  • 我没有要显示的代码,因为在某些时候 system(0) 开始返回 0 而不是 1,我似乎仍然无法找到导致该问题的确切代码。
猜你喜欢
  • 2020-10-28
  • 1970-01-01
  • 2015-06-11
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多