Почему fcntl (fd, F_SETFL, 0) используется в программировании последовательного порта

Я начинаю программирование последовательного порта в 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; см. ОШИБКИ, ниже.

Это из справочной страницы .