Перенаправление cout в файл против записи в файл непосредственно в Linux - PullRequest
1 голос
/ 06 октября 2009

Как для программ на C ++ / linux запись в cout (когда cout была перенаправлена ​​в файл во время запуска программы) сравнивается с записью в целевой файл напрямую? (через, скажем, fstream)

Выполняет ли система соответствующую магию в начале программы, чтобы сделать эти два случая абсолютно эквивалентными, или более поздний вариант должен быть лучше первого?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 06 октября 2009

Они в основном эквивалентны. В обоих случаях базовый буфер потока в итоге вызовет системный вызов write () для того же эффекта.

Обратите внимание, что по умолчанию cout синхронизируется с stdio для обратной совместимости (поэтому вы можете использовать стандартный вывод в стиле C, а также cout и заставить его работать как положено). Эта дополнительная синхронизация может замедлить вывод C ++. Если это важно, то вы можете использовать std :: ios_base :: sync_with_stdio (false), чтобы отсоединить их. Затем файл-перенаправленный cout и fstream должны иметь практически одинаковую производительность и функцию.

2 голосов
/ 06 октября 2009

Первое лучше подходит для философии инструментов UNIX, то есть для подпитки программы выводом другого.

Допустим, ваши программы печатают числа, и вам нужно их отсортировать. Вы передаете инструменту сортировки выходные данные своих команд, а затем записываете результат в файл, всегда с перенаправлением вывода.

Напротив, если вы написали напрямую в файл, вы не смогли бы в него.

Конечно, если вы не планируете, чтобы ваше приложение делало подобные вещи, вы можете записать файл напрямую. Но если бы я был в тебе, я позволю пользователю решать. Может быть, с аргументом командной строки.

0 голосов
/ 06 октября 2009

Да. Если процесс порождения установил, что дескриптор файла 1 (стандартный вывод) является результатом вызова open () для файла на диске, то ввод-вывод дочернего процесса для этого дескриптора будет точно эквивалентным тот же ввод-вывод, что и для файла, который он открыл вручную. То же самое верно для процессов, порожденных с помощью канала или сокета (то есть эквивалентно поведению, открывшему свой собственный канал или сокет). На самом деле, ядро ​​не может даже отличить. Все, что имеет значение, - это то, как был создан файловый дескриптор (то есть, с помощью какого системного вызова и на какой файловой системе), а не какой процесс это сделал.

0 голосов
/ 06 октября 2009

Я не думаю, что последнее обязательно "лучше" или "хуже". Конечно, это требует гораздо меньше кода, когда вы просто перенаправляете cout / stdout из оболочки. Это позволяет простой вывод текста (через printf / fprintf / cout).

Я предпочитаю использовать простые вызовы cout для быстрой и грязной регистрации и отладки в стиле "printf".

По своему опыту я использую системный журнал для вещей, которые абсолютно имеют для регистрации. Например, ошибки, когда файл не открывается или у вас закончились ресурсы или что-то в этом роде.

Я использую printf / fprintf для других «простых» задач регистрации.

Несколько лет назад я разработал простую систему отладки, которую теперь просто подключаю к своим новым приложениям Linux. Затем я могу просто вызвать соответствующие функции в этом коде. Это похоже на системный журнал в том, что он имеет «уровни» отладки. Например, уровень 1 всегда записывает в стандартный вывод, уровень 2 записывает в стандартный вывод, уровень 4 пишет в системный журнал, уровень 5 может создавать новый файл и записывать в него сообщения и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...