Вывод не печатается без fflush (stdout) - PullRequest
4 голосов
/ 29 ноября 2011

Я не понимаю, почему иногда мне нужно использовать fflush(), а иногда нет.

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

Ответы [ 3 ]

8 голосов
/ 29 ноября 2011

Я не понимаю, почему иногда мне нужно использовать fflush (), а иногда нет.

Иногда буферы stdio сбрасываются, а иногда нет.Например, простое включение «\ n» в печатный материал обычно сбрасывает его (поскольку stdout по умолчанию буферизуется при подключении к терминалу).

Когда программа выполняет ошибки,stdout не очищает свой буфер автоматически?

Буферы Stdio очищаются exit.Когда сигнал (такой как SIGSEGV) убивает процесс, exit не называется .Другой способ выйти из процесса без очистки буферов stdio - использовать специфичный для Unix вызов _exit.

1 голос
/ 29 ноября 2011

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

(И никто не пытается зарегистрироватьобработчик сигнала для SIGSEGV.)

0 голосов
/ 29 ноября 2011

"Я не могу понять, почему fflush (stdout) вызывается здесь в этом коде Я пытаюсь прокомментировать эту строку, и поведение было точно таким же. "

Потому что вы не гарантированно увидите предыдущий вывод printf (), если это вывод не заканчивается новой строкой.

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

См. этот сайт.

...