Friday, May 18th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Общая информация Управление дескрипторами

Управление дескрипторами

Большинство процессов ожидают, что при их запуске будут уже открыты три дескриптора. Этими дескрипторами являются 0, 1 и 2, более известные как стандартный ввод, стандартный вывод и стандартная ошибка соответственно. Обычно все три связываются с терминалом пользователя в процессе регистрации и наследуются запущенными пользователем процессами через fork и exec. Таким образом, программа может читать то, что набирает пользователь, читая стандартный ввод, и может посылать вывод на экран пользователю, записывая в стандартный вывод. Дескриптор стандартной ошибки также открыт для записи и используется для вывода ошибок, тогда как стандартный вывод используется для обычного вывода.

Эти (и другие) дескрипторы могут быть сопоставлены с объектами вместо терминала; такое сопоставление называется перенаправлением ввода/вывода, и все стандартные оболочки дают пользователю возможность это сделать. Оболочка может направить вывод программы в файл, закрыв дескриптор 1 (стандартный вывод) и открыв нужный файл таким образом, чтобы его новым дескриптором стал 1. Таким же образом оболочка может перенаправить стандартный ввод, закрыв дескриптор 0 и открыв файл.

Каналы дают возможность использовать вывод одной программы в качестве ввода другой, не требуя переписывания или даже перекомпоновки любой из программ. Вместо того чтобы установить дескриптор 1 (стандартный вывод) исходной программы для записи в терминал, в качестве него устанавливается входной дескриптор канала. Сходным образом дескриптор 0 (стандартный ввод) программы назначения ссылается на выходной конец канала, а не на клавиатуру терминала. Конечный набор из двух процессов и соединяющего их канала известен как конвейер (pipeline). Конвейеры могут представлять собой относительно длинную последовательность процессов, соединенных каналами.

Системные вызовы open, pipe и socket создают новые дескрипторы с наименьшим доступным неиспользуемым номером для дескриптора. Чтобы конвейеры работали, должен быть предусмотрен некоторый механизм для отображения этих дескрипторов в 0 и 1. Системный вызов dup создает копию дескриптора, который указывает на один и тот же элемент таблицы файлов. Новый дескриптор также является наименьшим неиспользуемым, но если нужный дескриптор сначала закрыт, dup может быть использован для нужного отображения. Однако необходима осторожность: если нужен дескриптор 1, а дескриптор 0 также окажется закрытым, результатом окажется дескриптор 0. Чтобы избежать этой проблемы, система предоставляет системный вызов dup2; он сходен с dup, но принимает дополнительный аргумент, указывающий номер нужного дескриптора (если нужный дескриптор уже открыт, dup2 закрывает его, прежде чем использовать повторно).


Похожие:
Еще по теме:
Советуем прочитать:

Автосервисы ремонт акпп на ниссан в спб.
Сейчас 64 гостей онлайн