Почему fcntl(fd, F_SETFL, 0) используется в программировании последовательных портов
Я начинаю программирование последовательного порта в Linux. Прочитав несколько примеров в Интернете, я не понимаю точного эффекта fcntl(fd, F_SETFL, 0)
? Это очищает биты, но на какие флаги это влияет? Что он устанавливает и / или очищает?
2 ответа
Возьми один за другим
1) Используется вызов функции
fcntl()
- Он выполняет операцию над дескриптором файла, переданным в аргументе.
2) 2-й аргумент в вызове
F_SETFL (int)
Установите для флагов состояния файла значение, указанное аргументом arg. Режим доступа к файлу (O_RDONLY, O_WRONLY, O_RDWR) и флаги создания файла (т. Е. O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) в аргументе игнорируются. В Linux эта команда может изменять только флаги O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME и O_NONBLOCK.
3) 3-й аргумент в вызове
Это 0 означает, что он устанавливает флаг состояния файла в ноль. Как сказал Жан-Батист Юнес в комментарии.
режим доступа к файлу и флаги создания файла игнорируются. Эта команда сбрасывает все остальные флаги: без добавления, без асинхронного, без прямого, без временного и неблокирующего
Итак, наконец
fcntl(fd, F_SETFL, 0)
Этот вызов установит дескриптор открытого файла 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) в аргументе игнорируются. В Linux эта команда может изменять только флаги O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME и O_NONBLOCK. Невозможно изменить флаги O_DSYNC и O_SYNC; см. ОШИБКИ ниже.
Это из справочной страницы.