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

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

Связь между дескрипторами файлов, дескрипцией открытых файлов и индексными дескрипторами показана на рис. 5.2. На этой схеме у двух процессов имеется несколько дескрипторов открытых файлов.

В процессе А два дескриптора — 1 и 20 — ссылаются на один и тот же дескриптор открытого файла (с пометкой 23). Такая ситуация может возникать в результате вызова dup(), dup2() или fcntl() (см. раздел 5.5).

Дескриптор 2 процесса А и дескриптор 2 процесса Б ссылаются на один и тот же файловый дескриптор (73). Этот сценарий может сложиться после вызова fork() (то есть процесс А является родительским по отношению к процессу Б или наоборот) либо при условии, что один процесс передал открытый дескриптор другому процессу, используя доменный сокет UNIX (см. подраздел 57.13.3).

И наконец, можно увидеть, что дескриптор 0 процесса А и дескриптор 3 процесса Б ссылаются на различные дескрипторы открытых файлов, но эти дескрипции ссылаются на одну и ту же запись в таблице индексных дескрипторов (1976), то есть на один и тот же файл. Дело в том, что каждый процесс независимо вызвал open() для одного и того же файла. Похожая ситуация может возникнуть, если один и тот же процесс дважды откроет один и тот же файл.

В результате можно прийти к следующим заключениям.

• Два различных файловых дескриптора, ссылающихся на одну и ту же дескрипцию открытого файла, совместно используют значение файлового смещения. Поэтому, если файловое смещение изменяется в связи с работой с одним файловым дескриптором (в результате вызовов read(), write() или lseek()), это изменение прослеживается через другой файловый дескриптор. Это применимо как к случаю, когда оба файловых дескриптора принадлежат одному и тому же процессу, так и к случаю, когда они принадлежат разным процессам.

• Аналогичные правила видимости применяются и к извлечению и изменению флагов состояния открытых файлов (например, O_APPEND, O_NONBLOCK и O_ASYNC) при использовании в системном вызове fcntl() операций F_GETFL и F_SETFL.

• В отличие от этого, флаги файлового дескриптора (то есть флаг закрытия при исполнении — close-on-exec) находятся в исключительном владении процесса и файлового дескриптора. Изменение этих флагов не влияет на другие файловые дескрипторы в одном и том же или в разных процессах.

5.5. Дублирование дескрипторов файлов

Использование синтаксиса перенаправления ввода-вывода (присущего Bourne shell) 2>&1 информирует оболочку о необходимости перенаправления стандартной ошибки (файловый дескриптор 2) в то же место, в которое выдается стандартный вывод (дескриптор файла 1). Таким образом, следующая команда станет (поскольку оболочка вычисляет направление ввода-вывода слева направо) отправлять и стандартный вывод, и стандартную ошибку в файл results.log:

$ ./myscript > results.log 2>&1

Рис. 5.2. Связь между дескрипторами файлов, дескрипцией открытых файлов и индексными дескрипторами

Оболочка перенаправляет стандартную ошибку, создавая дескриптор файла 2 дубликата дескриптора файла 1, так что он ссылается на ту же дескрипцию открытого файла, что и файловый дескриптор 1 (точно так же, как дескрипторы 1 и 20 процесса А ссылаются на одну и ту же дескрипцию открытого файла на рис. 5.2). Этого эффекта можно достичь, используя системные вызовы dup() и dup2().

Заметьте, что для оболочки недостаточно просто дважды открыть файл results.log: один раз с дескриптором 1 и один раз с дескриптором 2. Одна из причин состоит в том, что два файловых дескриптора не смогут совместно использовать указатель файлового смещения и это приведет к перезаписи вывода друг друга. Другая причина заключается в том, что файл может не быть дисковым. Рассмотрим следующую команду, отправляющую стандартную ошибку по тому же конвейеру, что и стандартный вывод:

$ ./myscript 2>&1 | less

Вызов dup() на основании аргумента oldfd открывает файловый дескриптор, возвращая новый дескриптор, ссылающийся на ту же самую дескрипцию открытого файла. Новый дескриптор гарантированно будет наименьшим неиспользованным файловым дескриптором.

#include

int dup(int oldfd);

При успешном завершении возвращает новый файловый дескриптор, а при ошибке выдает –1

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

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

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

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

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

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

Программирование, программы, базы данных
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

Стивен Прата

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