Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
int new_fd = fcntl(old_fd, F_DUPFD, 7); /* Возвращаемое значение между 7 и максимумом или неудача */int new_fd = dup2(old_fd, 7); /* Возвращаемое значение 7 или неудача */Вы можете имитировать поведение
dup()fcntl(old_fd, F_DUPED, 0)Если вы помните, что дескрипторы файлов являются просто индексами внутренней таблицы, работа этой функции должна быть ясна. Третий аргумент просто предоставляет индекс, с которого ядро должно начать поиск неиспользуемого дескриптора файла.
Использовать ли в собственном коде
fcntl()F_DUPEDdup()dup2()dup()dup2()9.4.3.3. Работа с флагами статуса файла и режимами доступа
В разделе 4.6.3 «Возвращаясь к
open()open()Таблица 9.4. Флаги O_xx для
open()creat()fcntl()| Категория | Функции | Флаги |
|---|---|---|
| Доступ к файлу | open()fcntl() | O_RDONLYO_RDWRO_WRONLY |
| Создание файла | open() | O_CREATO_EXCLO_NOCTTYO_TRUNC |
| Статус файла | open()fcntl() | O_APPENDO_DSYNCO_NONBLOCKO_RSYNCO_SYNC |
Помимо первоначальной установки различных флагов с помощью
open()fcntl()cmdF_GETFLF_SETFLO_NONBLOCKint fd_flags;if ((fd_flags = fcntl(fd, F_GETFL)) < 0) /* обработать ошибку */if ((fd_flags & O_NONBLOCK) != 0) { /* Установлен неблокирующий флаг */ fd_flags &= ~O_NONBLOCK; /* Сбросить его */ if (fcntl(fd, F_SETFL, fd_flags) != 0) /* Дать ядру новое значение */ /* обработать ошибку */}Помимо самих режимов именованная константа
O_ACCMODEfd_flags = fcntl(fd, F_GETFL);switch (fd_flags & O_ACCESS) {case O_RDONLY: /* ...действия только для чтения... */ break;case O_WRONLY: /* ...действия только для записи... */ break;case O_RDWR: /* ...действия для чтения и записи... */ break;}POSIX требует, чтобы
O_RDONLYO_RDWRO_WRONLYИспользуя
F_SETFLO_APPEND9.4.3.4. Неблокирующий ввод/вывод для каналов и FIFO
Ранее для описания способа работы каналов мы использовали сравнение с двумя людьми, моющими и вытирающими тарелки с использованием сушилки; когда сушилка заполняется, останавливается моющий, а когда она пустеет, останавливается вытирающий. Это блокирующее поведение: производитель или потребитель блокируются в вызове
write()read()В действительности человек, ожидающий опустения или заполнения сушилки, не должен просто неподвижно стоять. [101] Вместо этого незанятый супруг мог бы пойти и найти другую работу по кухне (такую, как подметание всех крошек за детьми на полу), пока сушилка снова не будет готова.
На языке Unix/POSIX эта концепция обозначается термином неблокирующий ввод/вывод, т.е. запрошенный ввод/вывод либо завершается, либо возвращает значение ошибки, указывающее на отсутствие данных (для читающего) или отсутствие места (для записывающего). Неблокирующий ввод/вывод применяется к каналам и FIFO, а не к обычным файлам на диске. Он может применяться также и к определенным устройствам, таким как терминалы, и к сетевым соединениям, обе эти темы выходят за рамки данной книги.
С функцией
open()O_NONBLOCKfcntl()open()read()