Почему 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; см. ОШИБКИ ниже.

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

Другие вопросы по тегам