2014-01-24 5 views
2

Я пытаюсь скомпилировать порт 1991 C оригинального Crowther/Woods FORTRAN Колоссальное пещерное приключение. Код - ужасный беспорядок, но после изменения некоторых его разделов он компилируется и работает правильно.C программа отказывается трубить?

Проблема в том, что когда я пытаюсь передать ее вывод в другую программу или в файл, ничего не появляется. ./adventure хорошо работает, но ./adventure | cat ничего не печатает. Grepping для вызова fstat ничего не получается.

Есть ли другой способ, которым программа может обнаруживать трубу и переходить в бесшумный режим? Даже добавление printf("Hello World"); в качестве первой строки основной функции не вызывает ничего, что может появиться через cat.

EDIT: Я использую версию Джима Гиллогли, но ссылка, с которой я получил источник, потухла. Я найду еще одну ссылку для скачивания.

+0

Возможно, это не «выход в тихий режим». Когда stdout - это tty, по умолчанию это строка буферизирована. Когда это канал, он блокируется блоком. Ваши данные, вероятно, просто сидят в буфере. –

+3

Чтобы увидеть это поведение в более простой программе, напишите приветственную программу мира, которая печатает «hello world \ n», а затем переходит в режим сна в течение 10 секунд. Обратите внимание на разницу в поведении, когда эта программа записывает в терминальные стихи, записывающие в трубу. (Убедитесь, что вы печатаете новую строку.) –

ответ

3

Как уже отмечалось, stdout, вероятно, заблокирован буфером, поскольку он больше не открывается терминалу. Попробуйте добавить звонок:

setvbuf(stdout, NULL, _IOLBF, 0); 

где-то около начала программы. Это изменит stdout на режим буферизации в строке, который будет выгружать вывод, как только программа будет писать новую строку.

1

Вместо замены программы на Linux вы также можете поэкспериментировать с изменением режима буфера из командной строки с использованием stdbuf (хотя очевидно, что любые вызовы setvbuf переопределяют это). Например, вы могли бы попробовать:

stdbuf -oL ./adventure | cat 

Аналогичный эффект может быть достигнут с unbuffer (поставляется с expect) и script.

Смежные вопросы