Читаем Linux API. Исчерпывающее руководство полностью

Чтобы избежать этой проблемы, возникающей при смешивании системных вызовов и функций stdio для ввода-вывода, может потребоваться грамотное использование функции fflush(). Буферизацию также можно отключить с помощью функций setvbuf() или setbuf(), но это может повлиять на производительность ввода-вывода в приложении, поскольку в дальнейшем каждая операция вывода приведет к выполнению системного вызова write().

В SUSv3 приводится (длинный) список требований к приложениям, в которых допустимо смешивать системные вызовы и функции stdio для ввода-вывода. Подробности можно найти в разделе Interaction of File Descriptors and Standard I/O Streams в главе General Information тома System Interfaces (XSH).


13.8. Резюме


Буферизация входных и выходных данных выполняется ядром, а также библиотекой stdio. В некоторых случаях может понадобиться предотвратить буферизацию, но при этом нужно учитывать влияние, оказываемое на производительность приложения. Для управления буферизацией, выполняемой в ядре и осуществляемой библиотечными функциями, и для однократных сбросов буферов можно использовать разнообразные системные вызовы и библиотечные функции.

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

Характерный для Linux флаг O_DIRECT, используемый при системном вызове open(), позволяет специализированным приложениям обходить буферную кэш-память.

Функции fileno() и fdopen() помогают решить задачу смешивания системных вызовов и стандартных библиотечных функций языка C, чтобы выполнять ввод-вывод в отношении одного и того же файла. Для заданного потока функция fileno() возвращает соответствующий дескриптор файла, а функция fdopen() выполняет обратную операцию, создавая новый поток, который использует указанный открытый дескриптор файла.


Дополнительная информация

Описание реализации и преимуществ использования буферной кэш-памяти в System V приводится в издании [Bach, 1986]. В книгах [Goodheart & Cox, 1994] и [Vahalia, 1996] также дается описание целесообразности применения и реализации буферной кэш-памяти в System V. Дополнительную информацию, характерную для Linux, можно найти в изданиях [Bovet & Cesati, 2005] и [Love, 2010].


13.9. Упражнения


13.1. Используя встроенную команду оболочки time, попробуйте замерить время работы программы из листинга 4.1 (copy.c) в своей системе:

1) проведите эксперименты с использованием различных размеров файлов и буферов памяти. Размер буфера памяти можно задать при компилировании программы с помощью ключа — DBUF_SIZE=nbytes;

2) добавьте флаг O_SYNC в системный вызов open(). Определите, насколько это повлияет на скорость при различных размерах буферной памяти;

3) попробуйте выполнить тесты по замеру времени в нескольких файловых системах (например, ext3, XFS, Btrfs и JFS). Будут ли результаты похожи друг на друга? Будет ли совпадать динамика при переходе от небольших к большим размерам буферов памяти?

13.2. Замерьте время работы программы filebuff/write_bytes.c (предоставляемой в исходном коде, распространяемом для этой книги) для различных размеров буферов памяти и файловых систем.

13.3. Каким будет эффект использования следующих инструкций?

fflush(fp);

fsync(fileno(fp));

13.4. Объясните, почему вывод при выполнении следующего кода изменяется в зависимости от того, куда перенаправляется стандартный вывод — на терминал или в дисковый файл.

printf("If I had more time, \n");

write(STDOUT_FILENO, "I would have written you a shorter letter.\n", 43);

13.5. Команда tail [— n num] file выводит последние num строк (по умолчанию десять) указанного файла. Реализуйте эту команду, используя системные вызовы ввода-вывода (lseek(), read(), write() и т. д.). Чтобы реализация работала эффективно, не забудьте про рассмотренные в этой главе вопросы буферизации.

14. Файловые системы

В главах 4, 5 и 13 мы рассмотрели файловый ввод-вывод, уделив особое внимание обычным (то есть дисковым) файлам. В этой и последующих главах мы более подробно разберем некоторые темы, связанные с файлами.

• В текущей главе речь идет о файловых системах.

• В главе 15 описаны различные атрибуты файла, включая метки времени, принадлежность и права доступа.

• В главах 16 и 17 обсуждаются две новые особенности системы Linux 2.6: расширенные атрибуты и списки контроля доступа (ACL). Расширенные атрибуты — это способ привязки произвольных метаданных к файлу. Списки контроля доступа — это расширенный вариант традиционной UNIX-модели прав доступа к файлу.

• В главе 18 рассмотрены каталоги и ссылки.

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных