Я пытаюсь запустить простую программу на языке C ++ ниже на кластере компьютеров (под управлением Linux, CentOS 6).
#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). Если я запускаю его на любом из исполнительных узлов и отпускаю вывод в терминал, он работает просто отлично; однако, если я пытаюсь перенаправить вывод в файл, файл всегда будет пустым.
Я знаю, что это не «стандартный» способ, которым можно было бы написать программу hello world на C ++. Я на самом деле испытываю трудности со сторонней программой, которая пытается записать двоичные данные в стандартный вывод, используя библиотеку, для которой требуется имя файла. Пытаясь уменьшить код для публикации, я обнаружил, что приведенный выше код является простейшим кодом, который воспроизводит проблему, которую я вижу в более крупной программе.
Я не опытный программист на C ++, поэтому понятия не имею, должен ли приведенный выше пример работать или не работать, но тот факт, что он работает на некоторых компьютерах, как я ожидал, но не на других, поставил меня в тупик. Я также не уверен, имеет ли это отношение к коду C ++, bash или конфигурации системы. Люди, которых я спрашивал об этом, уже выглядят одинаково смущенными и не могут даже предложить, с чего начать.
Я создал простые программы hello world на других языках, и все они работают должным образом на узлах выполнения, поэтому я предполагаю, что это что-то специфическое для C ++.
Может кто-нибудь объяснить мне или помочь мне определить, почему я наблюдаю различное поведение на машинах, работающих под управлением одной и той же ОС (и которые должны быть настроены одинаково), и есть ли (предпочтительный) способ в C ++ для получения библиотечных функций, которые Требуется имя файла для записи в стандартный вывод?
Я посмотрел вокруг и обнаружил, что может или не может быть программа, которую вы используете: UUENCODE. Если это не так, не обращайте внимания на весь этот ответ. Эта программа выглядит хитрой в использовании, поэтому я обрисую в общих чертах то, что я считаю разумным способом ее использования:
Дайте что-нибудь как «имя выходного файла» uuencode
uuencode mybinaryfile anything > mytextfile
Затем перенесите полученный «mytextfile» в новую систему, где вы запускаете
uudecode mytextfile -o mynewbinaryfile
Который производит «mynewbinaryfile». Опять же, дизайн этой программы (особенно аргумент, который я передал как «что-нибудь») невелик, и существуют проблемы с порядком байтов и размерами при переносе двоичных файлов с одного компьютера на другой, которые эта программа игнорирует. Я рекомендую отойти от этого.
Что касается объяснения, uudecode пытался записать в / dev / stdout, а на кластерах и машинах HPC все обычные условия, такие как / dev / stdout, больше не являются тем, чем они кажутся.
Ну, вероятно, проблема с mode
параметр для fstream.open()
,
И, кстати, это довольно странный способ выполнить вывод конфигурации …