Хрестоматия по программированию на Си в Unix


Работа с файлами. Хрестоматия по программированию на Си в Unix


Что будет выдано на экран в результате выполнения программы?

#include <stdio.h>

main(){ printf( "Hello, " ); printf( "sunny " ); write( 1, "world", 5 ); }

Ответ: очень хочется ответить, что будет напечатано "Hello, sunny world", поскольку printf выводит в канал stdout, связанный с дескриптором 1, а дескриптор 1 связан поумолчанию с терминалом. Увы, эта догадка верна лишь отчасти! Будет напечатано "worldHello, sunny ". Это происходит потому, что вывод при помощи функции printf

буферизован, а при помощи сисвызова write - нет. printf помещает строку сначала в буфер канала stdout, затем write выдает свое сообщение непосредственно на экран, затем по окончании программы буфер выталкивается на экран.

Чтобы получить правильный эффект, следует перед write() написать вызов явного выталкивания буфера канала stdout:

fflush( stdout );

Еще одно возможное решение - отмена буферизации канала stdout: перед первым printf

можно написать

setbuf(stdout, NULL);

Имейте в виду, что канал вывода сообщений об ошибках stderr не буферизован исходно, поэтому выдаваемые в него сообщения печатаются немедленно.

Мораль: надо быть очень осторожным при смешанном использовании буферизованного и небуферизованного обмена.

Некоторые каналы буферизуются так, что буфер выталкивается не только при заполнении, но и при поступлении символа '\n' ("построчная буферизация"). Канал stdout

именно таков:

printf("Hello\n");

печатается сразу (т.к. printf выводит в stdout и есть '\n'). Включить такой режим буферизации можно так:

setlinebuf(fp); или в других версиях setvbuf(fp, NULL, _IOLBF, BUFSIZ);

Учтите, что любое изменение способа буферизации должно быть сделано ДО первого обращения к каналу!

Напишите программу, выдающую три звуковых сигнала. Гудок на терминале вызывается выдачей символа '\7' ('\a' по стандарту ANSI). Чтобы гудки звучали раздельно, надо делать паузу после каждого из них. (Учтите, что вывод при помощи printf() и putchar() буферизован, поэтому после выдачи каждого гудка (в буфер) надо вызывать функцию fflush() для сброса буфера).

Ответ:




- Начало -  - Назад -  - Вперед -



Книжный магазин