2014-02-10 68 views
0

我想要(运行Linux,CentOS 6的)的计算机集群上运行下面的简单的C++程序,以产生输出。C++程序失败重​​定向标准输出时到一个文件在Linux

#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 

产生包含行“你好,世界”(我使用bash)的文件myfile.txt。如果我在任何执行节点上运行它并让输出进入终端,它就可以正常工作;但是,如果我尝试将输出重定向到文件,则文件始终为空。

我知道,这是不是“标准”的方式一会C++编写一个Hello World程序。我实际上遇到了第三方程序的困难,该程序试图使用需要文件名的库将二进制数据写入标准输出。在试图减少发布的代码时,我发现以上是最简单的代码,它可以再现我在较大程序中看到的问题。

我不是一个C++程序员的经验,所以不知道上面的例子应该或不应该工作,但事实上,它在一些计算机上工作,因为我期望但不是别人让我难倒。我也不确定这是否与C++代码,bash或系统配置有关。我询问过的人似乎已经同样困惑,甚至无法建议从哪里开始寻找。

我在其他语言创建简单的Hello World程序,并如期执行节点上的所有这些工作,所以我认为这是专门针对C++的东西。

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

+5

你为什么要写stdin而不是stdout? – keshlam

+0

假设你使用'stdout'并且它实际上在头节点上工作 - 问题可能是你的集群没有集群安全的'stdout';它是什么样的群集? –

+1

@Keshlam闻起来像一个X和Y的问题。 – 2014-02-10 01:24:29

回答

0

嗯,有可能的问题是mode参数fstream.open()

而且,通过它的方式是进行配置输出一个相当奇怪的方式...

1

我环顾四周,发现什么可能会或可能不会是你正在使用的程序:uuencode。如果不是这样,不要理会这整个答案。该方案看上去棘手的使用,所以我将概述我认为是使用它的一个明智的办法:

我愿付出一切的“输出文件名”来对其进行uuencode

uuencode mybinaryfile anything > mytextfile 

然后转移所产生的“mytextfile “到你运行的新系统

uudecode mytextfile -o mynewbinaryfile 

哪个产生”mynewbinaryfile“。同样,这个程序的设计(特别是我作为“任何东西”传入的参数)并不是很好,并且在将二进制文件从一台机器移动到另一台机器时忽略了这种程序忽略的排序和字体大小。我建议远离它。

至于说明,uudecode试图写入/ dev/stdout,并且在集群和HPC机器上,所有通常的解决方法(如/ dev/stdout)不再是它们看起来的东西。

+0

我实际试图使用的程序叫做[laser](http://code.google.com/p/clever-sv/),它反过来使用[bamtools](https://github.com)/pezmaster31/bamtools)编写二进制文件。你能详细说明你的意思吗?“像/ dev/stdout这样的平常住宿不再是他们所看到的”? – jjellis

+0

由于在很多情况下,来自多个计算节点的stdout必须多路复用到单个输出流,因此系统处理输出可以是专用的。在计算节点上运行'file/dev/stdout'的结果是什么? –

+0

''/ dev/stdout:'/ proc/self/fd /'的符号链接''' – jjellis

相关问题