Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Открытие FIFO с установленным или сброшенным
O_NONBLOCKopen("/fifо/file", O_RDONLY, mode)Блокируется до открытия FIFO для записи.
open("/fifo/file", O_RDONLY | O_NONBLOCK, mode)Открывает файл, возвращаясь немедленно.
open("/fifo/file", O_WRONLY, mode)Блокирует до открытия FIFO для чтения.
open("/fifo/file", O_WRONLY | O_NONBLOCK, mode)Если FIFO был открыт для чтения, открывает FIFO и немедленно возвращается. В противном случае возвращает ошибку (возвращаемое значение -1 и
errnoENXIOКак описано для обычных каналов, вызов
read()O_NONBLOCKread(fd, buf, count) и сброшенный O_NONBLOCKФункция
read()read(fd, buf, count) и установленный O_NONBLOCKФункция
read()errno EAGAINВ заключение, поведение
write()<unistd.h>PIPE_BUFPIPE_BUFPIPE_BUF_POSIX_PIPE_BUFPIPE_BUFPIPE_BUFВо всех случаях для каналов и FIFO
write()Также во всех случаях, как упоминалось, записи размером вплоть до
PIPE_BUFPIPE_BUFPIPE_BUFO_NONBLOCKКак и в случае с
read()O_NONBLOCKwrite()Наиболее все усложняется, когда установлен
O_NONBLOCK| размер ≥ nbytes | размер < abytes | |
|---|---|---|
nbytes ≤ PIPE_BUF | write() | write()(-1)/EAGAIN |
| размер > 0 | размер = 0 | |
nbytes > PIPE_BUF | write() | write()(-1)/EAGAIN |
Для файлов, не являющихся каналами и FIFO и к которым может быть применен
O_NONBLOCKразмер > 0
write()размер = 0
write()-1/EAGAINХотя есть ряд сбивающих с толку изменений поведения в зависимости от того, канал это или не канал, установлен
O_NONBLOCK• Всегда можно отличить конец файла:
read()• Если нет доступных для чтения данных,
read()EAGAIN• Если для записи нет места,
write()O_NONBLOCKEAGAIN• Когда место есть, будет записано столько данных, сколько возможно, так что в конечном счете все данные будут переписаны.
Подводя итог, если вы собираетесь использовать неблокирующий ввод/вывод, любой код, который использует
write()write()Более того, вы должны быть готовы обработать
EAGAINwrite()EAGAINНеблокирующий ввод/вывод действительно усложняет вашу жизнь, в этом нет никакого сомнения. Но для многих приложений он является необходимостью, позволяющей выполнить задание. Снова рассмотрите спулер печати. Демон спулера не может позволить себе находиться в блокирующем
read()
