【问题标题】:C++ program fails to produce output when redirecting stdout to a file on Linux将标准输出重定向到 Linux 上的文件时,C++ 程序无法产生输出
【发布时间】:2014-02-10 00:59:28
【问题描述】:

我正在尝试在计算机集群(运行 Linux、CentOS 6)上运行下面的简单 c++ 程序。

#include <iostream>
#include <fstream>

int main(int argc, char *argv[]) {
    std::ofstream file;
    file.open("/dev/stdout");
    file << "Hello, world\n";
    file.close();
    return 0;
}

当我编译(使用g++ test.cpp)并在头节点上运行程序时,无论我是否让输出转到将其重定向到文件的终端,它都可以正常工作。也就是说,

$ ./a.out > myfile.txt

生成一个文件myfile.txt,其中包含“Hello, world”行(我使用的是 bash)。如果我在任何执行节点上运行它并让输出到终端它工作得很好;但是,如果我尝试将输出重定向到文件,则该文件始终为空。

我知道这不是用 C++ 编写 hello world 程序的“标准”方式。实际上,我在尝试使用需要文件名的库将二进制数据写入标准输出的第 3 方程序时遇到了困难。在尝试减少要发布的代码时,我发现上面是重现我在更大程序中看到的问题的最简单的代码。

我不是一个有经验的 C++ 程序员,所以不知道上面的例子是否应该工作,但事实上它可以在某些计算机上运行,​​正如我所期望的那样,但在其他计算机上却不行,这让我很难过。我也不确定这是否与 C++ 代码、bash 或系统配置有关。我问过这个问题的人似乎已经同样感到困惑,甚至无法建议从哪里开始寻找。

我用其他语言创建了简单的 hello world 程序,这些程序在执行节点上都按预期工作,所以我假设这是 C++ 特有的。

任何人都可以向我解释,或帮助我确定为什么我在运行相同操作系统(并且应该配置相同)的机器上观察到不同的行为,并且在 C++ 中是否有(首选)方法来获取需要文件名才能写入标准输出的库函数?

【问题讨论】:

  • 你为什么要写入标准输入,而不是标准输出?
  • 假设您使用了 stdout 并且它确实在头节点上工作 - 问题很可能是您的集群没有集群安全 stdout;是什么样的集群?
  • @Keshlam 闻起来像 X 和 Y 问题。
  • 是的,对不起,这是一个错字,它应该是标准输出而不是标准输入。
  • @ElliottFrisch 对不起我的天真,但我不完全理解你所说的集群类型是什么意思。目前,我只是通过 ssh 进入执行节点并运行程序。

标签: c++ linux bash io-redirection


【解决方案1】:

我环顾四周,发现您正在使用的程序可能是也可能不是:uuencode。如果不是这样,请忽略整个答案。该程序看起来很难使用,所以我将概述我认为合理的使用方式:

将任何内容作为“输出文件名”提供给 uuencode

uuencode mybinaryfile anything > mytextfile

然后将生成的“mytextfile”传输到您运行的新系统

uudecode mytextfile -o mynewbinaryfile

这会产生“mynewbinaryfile”。同样,这个程序的设计(尤其是我作为“任何东西”传入的参数)不是很好,并且在将二进制文件从一台机器移动到另一台机器时存在字节序和类型大小的问题,该程序忽略了这一点。我建议远离它。

至于解释,uudecode 试图写入 /dev/stdout,而在集群和 HPC 机器上,所有像 /dev/stdout 这样的常见配置都不再是它们看起来的样子。

【讨论】:

  • 我实际尝试使用的程序名为laser,它又使用bamtools 来编写二进制文件。您能否详细说明“像 /dev/stdout 之类的常规调整不再像它们看起来那样”是什么意思?
  • 由于在许多情况下必须将来自多个计算节点的标准输出多路复用到单个输出流,因此可以专门处理系统输出。 file /dev/stdout在计算节点上运行的结果是什么?
  • /dev/stdout: symbolic link to `/proc/self/fd/'
【解决方案2】:

好吧,问题可能出在fstream.open()mode 参数上。

而且,顺便说一句,执行配置输出的方式相当奇怪......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2011-06-17
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多