【问题标题】:Execute Linux shell command in c++ while hiding its output在 C++ 中执行 Linux shell 命令,同时隐藏其输出
【发布时间】:2012-11-19 13:41:40
【问题描述】:

我想用 execl 或 system(或其他命令)从“/sbin/”执行一个 Linux shell 命令,并隐藏它的输出。

我已经在使用“fork”来获取子进程...

如果我进入...

service "servicename" restart

我会看到“restarting xyz [OK]”的输出。相反,我只是希望命令静默执行并丢弃其输出,而不是显示在我的控制台应用程序中。

【问题讨论】:

  • 这是非常模糊的。你需要说你在这里做什么。这可能与 C++ 没有任何关系。您只需要阅读您使用的调用的手册页。您可能希望避免在用户输入上使用system,因为它会使用 shell 来解释它。也许只需要提醒您在forkexec 之间重新打开stdout 和stderr?
  • 我没有用户输入,我使用 C++ 程序重新启动 2 个特定服务。

标签: c++ linux shell output


【解决方案1】:

您可以将其附加到您的命令中: " > /dev/null 2>&1 "

所以你的命令变成: 服务 [服务名称] 重启 > /dev/null 2>&1

它的作用是将stderr重定向到stdout(2>&1),并将stdout重定向到/dev/null(> /dev/null)

【讨论】:

    【解决方案2】:

    将输出重定向到/dev/null

    例如,

    service smb restart 1> /dev/null

    service smb restart 2> /dev/null

    其中12 代表stdoutstderr

    【讨论】:

    • 使用 c++ 命令执行它,输出不应该重定向到标准输出,是吗?
    • 对不起,“C++ 命令”是什么意思?在所有 unix 上,子进程继承所有 fd,包括 stdout 和 stderr。此外,在 fork 之后(在 exec 之前),该进程是一个克隆,因此显然它的输出与父进程完全相同。在 exec 上,标准流将被重新初始化(丢弃缓冲区等),但 stdio 文件的 fd 在 exec 之后将是相同的。
    猜你喜欢
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多