【发布时间】: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