【问题标题】:How to discard the output from a system command?如何丢弃系统命令的输出?
【发布时间】:2018-01-05 23:40:18
【问题描述】:

我最近用C写了这段代码来执行系统命令。我只是想测量这个系统命令执行的时间。

但是,我不希望在执行此程序时显示输出结果。

#include <stdio.h>
int main(int argc, char* argv[])
{
    system("ls");
    return 0;
}

如何丢弃系统命令的输出?

【问题讨论】:

  • 如果你不想打印结果,你想让他们去哪里?
  • ls 列出文件有什么意义?运行 ls 的全部目的是将文件和文件夹列表放在终端上。如果您不想这样做,请不要运行 ls。这是一个 XY 问题 - 我做错了事情来完成某件事,但现在它给我带来了第二个问题。我该如何解决第二个问题? 你没有;修复第一个,第二个消失。
  • 如果您想获取目录中的文件列表以在程序中对其进行操作,请使用DIR 类型。见这里stackoverflow.com/questions/612097/…
  • 重定向输出到 >/dev/null
  • @user9179677:为什么不直接运行time ls &gt;/dev/null,然后跳过包装? C 中的包装是做什么的(除了通过将 ls 的单个进程启动更改为三个,一个用于您的程序,一个用于运行 ls 的 shell 以及一个用于 ls 的进程来增加开销)?

标签: c linux output-redirect


【解决方案1】:

当您从 C 调用 system() 时,会调用一个 shell 来解释您的命令。这意味着您可以使用 shell 重定向:

system("ls > /dev/null");

如果你也想抑制错误

system("ls > /dev/null 2>&1");

但是,由于运行 shell 的开销和构造 shell 命令的脆弱性,最好尽可能避免使用system()

【讨论】:

  • 系统调用 是一个定义明确的术语,在这种情况下可能会造成混淆。我认为一些反引号可以提供帮助:system() 调用
  • 确实最好避开system()。它对 shell 的使用和特殊的信号处理行为使其具有单一合法用途:执行用户请求的 shell 命令(例如,通过vi 中的!)。
  • @DavisHerring 即便如此,运行用户的登录 shell 也可以说比 system() 使用的 /bin/sh 更好
  • 但是我的命令system("chcp 936")没有办法重定向输出,怎么办?
【解决方案2】:

如果你想通过系统命令测量时间,你可以在系统调用中重定向standout和stderr。不确定这是最优雅的,但它有效:

#include <stdlib.h>
#include <stdio.h>
int main() {
    system("ls >/dev/null 2>&1");
}

请注意,system 需要 &lt;stdlib.h&gt; 标头。

【讨论】:

  • 您建议重定向标准输出和标准错误,但您提供的示例仅重定向标准输出。
  • @Turn 你是对的,我编辑了答案。虽然,fwiw,ls 不应该真的在 stderr 上打印任何东西;)我们只能希望无论 OP 试图实现什么,都不是那种必须扩展或解释奇怪的边缘情况的东西,因为上帝知道这种方法一开始有点疯狂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2014-12-26
  • 2010-12-25
  • 2016-06-03
  • 2014-01-27
相关资源
最近更新 更多