2016-05-13 5 views
-3

Что делать, если я использую printf для вывода строки в буффульный буфер stdout?Linux: printf to fulled stdout

printf будет долго ждать функции write()?

Кстати, стандартный вывод используется для системы или каждого процесса?

Может ли кто-нибудь мне помочь?

+0

Я не знаю механизм stdout, поэтому я добавляю этот вопрос. Если я ошибаюсь. пожалуйста, помогите мне поправить – bvp147

+0

@PaulRooney, судя по комментариям ниже, я думаю, что он спрашивает, что произойдет, если программа пишет так много данных, что буфер stdout заполняет –

+0

@Paul Rooney: я обновил свой вопрос для буфера stdout – bvp147

ответ

-1

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

+0

спасибо , Я столкнулся с проблемой повесить, когда когда я печатаю f на stdout, он зависает в функции записи. Но я не знаю причину # 0 0x004ad430 в __kernel_vsyscall() # 1 0x009d782b в записи() из /lib/libc.so.6 # 2 0x00971224 в _IO_new_file_write() из /lib/libc.so 0,6 # 3 0x00972b00 в _IO_new_do_write() из /lib/libc.so.6 # 4 0x00971cb2 в _IO_new_file_overflow() из из/Библиотека/Libc /lib/libc.so.6 # 5 0x00970e62 в _IO_new_file_xsputn(). so.6 # 6 0x009499bf в vfprintf() из /lib/libc.so.6 Вы знаете это? – bvp147

+0

Можете ли вы предоставить свой код, а также включить командную строку, которую вы используете для запуска программы? – kcraigie

+0

Мой псевдо-код for (;;) { char str [128] = ""; gettimeofday (& tv, NULL); local_t = localtime (& tv.tv_sec); sprintf (str, 128, "% 02d:% 02d:% 02d", tmp-> tm_hour, tmp-> tm_min, tmp-> tm_sec}; printf ("% s", str); } – bvp147

1

Это зависит от того, что он пишет, и от того, использует ли он блокирующий или неблокирующий ввод-вывод. Обычно он блокируется по умолчанию. Но имейте в виду, что printf буферизует свой вывод, поэтому вы можете не знать, была ли проблема до тех пор, пока не исчезнет stdout. Если вы действительно хотите знать, была ли проблема, вы должны проверить возвращаемое значение от fclose.

Другая возможность заключается в том, что буфер просто не очищается. Обычно stdout поддерживает буферизацию строки, что означает, что он очищается при записи символа новой строки. Вы можете заставить его сброситься, позвонив fflush(stdout);, чтобы узнать, не изменилось ли это. Я также предлагаю, чтобы ваш вывод заканчивался символом новой строки.

+0

Спасибо. Но я пытаюсь добавить fflush (stdout) после printf. Повесьте снова. – bvp147