Я начинаю программирование последовательного порта в Linux. Прочитав несколько примеров в Интернете, я не понимаю точный эффект fcntl(fd, F_SETFL, 0)
? Это очистка бит, но какие флаги это влияет? Что он устанавливает и / или очищает?
Возьмите один за другим
1) Используемый вызов функции
fcntl()
– Выполняет операцию над файловым дескриптором, переданным в аргументе.
2) Второй аргумент в вызове
F_SETFL (int)
Установите флаги состояния файла в значение, заданное параметром arg. Режим доступа к файлам (O_RDONLY, O_WRONLY, O_RDWR) и флаги создания файлов (то есть O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) в arg игнорируются. В Linux эта команда может изменять только флаги O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME и O_NONBLOCK.
3) Третий аргумент в вызове
Он равен 0, он устанавливает флаг состояния файла в ноль. Как сказал в своем выступлении Жан-Батист Юнес.
режим доступа к файлам и флаги создания файлов игнорируются. Эта команда перезагружает все остальные флаги: нет append, нет async, нет direct, no atime и не блокируется
Итак, наконец
fcntl(fd, F_SETFL, 0)
Этот вызов установит флаг file status
открытого файла файла описания file status
на значение 0.
Но так идеально, что мы не должны менять флаг состояния файла. Лучший способ – сначала получить флаг состояния текущего файла, используя F_GETFL
а затем просто изменить требуемый бит. См. Пример:
Если вы хотите изменить флаги состояния файла, вы должны получить текущие флаги с F_GETFL и изменить значение. Не предполагайте, что перечисленные здесь флаги являются единственными, которые реализованы; ваша программа может запускаться годами, и тогда может существовать больше флагов. Например, здесь есть функция установки или очистки флага O_NONBLOCK без изменения каких-либо других флагов:
/* Set the O_NONBLOCK flag of desc if value is nonzero, or clear the flag if value is 0. Return 0 on success, or -1 on error with errno set. */ int set_nonblock_flag (int desc, int value) { int oldflags = fcntl (desc, F_GETFL, 0); /* If reading the flags failed, return error indication now. */ if (oldflags == -1) return -1; /* Set just the flag we want to set. */ if (value != 0) oldflags |= O_NONBLOCK; else oldflags &= ~O_NONBLOCK; /* Store modified flag word in the descriptor. */ return fcntl (desc, F_SETFL, oldflags); }
на страницу man для fcntl ()
F_SETFL (int)
Установите флаги состояния файла в значение, заданное параметром arg. Режим доступа к файлам (O_RDONLY, O_WRONLY, O_RDWR) и флаги создания файлов (то есть O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) в arg игнорируются. В Linux эта команда может изменять только флаги O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME и O_NONBLOCK. Невозможно изменить флаги O_DSYNC и O_SYNC; см. ОШИБКИ, ниже.
Это из справочной страницы .