Новые книги

Что объединяет многочисленные интернет-магазины, тематические группы в социальных сетях, веб-сайты коммерческих предприятий и информационные порталы? Наличие контента, который создают копирайтеры, – специалисты по разработке текстов.

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

Все права защищены. Никакая часть настоящей книги не может быть воспроизведена или передана в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопирование и запись на магнитный носитель, а также размещение в Интернете, если на то нет письменного разрешения владельцев.
Эта книга поможет быстро освоить новую версию дистрибутива Linux Fedora 8. В ней рассказывается, как установить Fedora 8 и выполнить базовую настройку системы после установки, организовать подключение к Интернету, настроить и использовать браузер Firefox, брандмауэр, загрузчик GRUB. Подробно объясняется, как установить и настроить менеджер пакетов, а также работать с ним, антивирусом, офисным пакетом ОреnOffiсе 2.3, cредствами мультимедиа и другим программным обеспечением. Обсуждается, как настроить работу видеокарты, монитора, периферийных устройств (принтера, сканера), подключить, к системе второй монитор или телевизор.

5.13 DUР

 

5.13 DUР

Системная функция dup копирует дескриптор файла в первое свободное место в таблице пользовательских дескрипторов файла, возвращая новый дескриптор пользователю. Она действует для всех типов файла. Синтаксис вызова функции:

   newfd = dup(fd);

где fd - дескриптор файла, копируемый функцией, а newfd - новый дескриптор, ссылающийся на файл. Поскольку функция dup дублирует дескриптор файла, она увеличивает значение счетчика в соответствующей записи таблицы файлов - записи, на которую указывают связанные с ней точки входа в таблице файловых дескрипторов, которых теперь стало на одну больше. Например, обзор структур данных, изображенных на Рисунке 5.20, показывает, что процесс вызывает следующую последовательность функций: он открывает (open) файл с именем "/etc/passwd" (файловый дескриптор 3), затем открывает файл с именем "local" (файловый дескриптор 4), снова файл с именем "/etc/passwd" (файловый дескриптор 5) и, наконец, дублирует (dup) файловый дескриптор 3, возвращая дескриптор 6.


Рисунок 5.20. Структуры данных после выполнения функции dup

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

Рассмотрим программу, приведенную на Рисунке 5.21. В переменной i хранится дескриптор файла, возвращаемый в результате открытия файла "/etc/passwd", а в переменной j - дескриптор файла, возвращаемый системой в результате дублирования дескриптора i с помощью функции dup. В адресном пространстве процесса оба пользовательских дескриптора, представленные переменными i и j, ссылаются на одну и ту же запись в таблице файлов и поэтому используют одно и то же значение смещения внутри файла. Таким образом, первые два вызова процессом функции read реализуют последовательное считывание данных, и в буферах buf1 и buf2 будут располагаться разные данные. Совсем другой результат получается, когда процесс открывает один и тот же файл дважды и читает дважды одни и те же данные (раздел 5.2). Процесс может освободить с помощью функции close любой из файловых дескрипторов по своему желанию, и ввод-вывод получит нормальное продолжение по другому дескриптору, как показано на примере. В частности, процесс может "закрыть" дескриптор файла стандартного вывода (файловый дескриптор 1), снять с него копию, имеющую то же значение, и затем рассматривать новый файл в качестве файла стандартного вывода. В главе 7 будет представлен более реалистический пример использования функций pipe и dup при описании особенностей реализации командного процессора.


     #include <fcntl.h>                                     
     main()                                                 
     {                                                      
         int i,j;                                           
         char buf1[512],buf2[512];                          
                                                            
         i = open("/etc/passwd",O_RDONLY);                  
         j = dup(i);                                        
         read(i,buf1,sizeof(buf1));                         
         read(j,buf2,sizeof(buf2));                        
         close(i);                                          
         read(j,buf2,sizeof(buf2));                         
     }                                                      

Рисунок 5.21. Программа на языке Си, иллюстрирующая использование функции dup

Предыдущая глава || Оглавление || Следующая глава