2014-02-10 66 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

相關問題