Есть ли способ установить минимальное количество символов для чтения с помощью fcntl ()? - PullRequest
1 голос
/ 05 июня 2019

В команде Linux stty мы можем установить минимум N символов для завершенного чтения, используя параметр min.

От стого человека

min N
    with -icanon, set N characters minimum for a completed read 
time N
    with -icanon, set read timeout of N tenths of a second

Есть ли способ установить эти параметры [min и time], используя fcntl() или любые C API. Я проверил человека fcntl() и open(), но не смог найти подходящий флаг.

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

В команде Linux stty мы можем установить минимум N символов для завершенного чтения, используя опцию min.

Есть ли способ установить эти параметры [min и time], используя fcntl () или любые другие API C.

Команда stty - это просто команда, которая обращается к termiosинтерфейс (последовательного терминала).
Программно можно использовать tcgetattr () и tcsetattr () .

См. Правильная настройка режимов работы терминала и Руководство по последовательному программированию для операционных систем POSIX


Пример кода C, который задает десяток и минимум-считайте для необработанного чтения открытого последовательного терминала:

int set_time_and_min(int fd, int time, int min)
{
  struct termios settings;
  int result;

  result = tcgetattr(fd, &settings);
  if (result < 0) {
      perror("error in tcgetattr");
      return -1;
  }
  settings.c_cc[VTIME] = time;
  settings.c_cc[VMIN] = min;
  result = tcsetattr(fd, TCSANOW, &settings);
  if (result < 0) {
      perror("error in tcsetattr");
      return -2;
  }
  return 0;
}

Я проверил функции fcntl () и open (), но не смог найти соответствующий флаг.

Справочной страницей для справки является termios (3).


Конечно значения VMIN и VTIME эффективны только при использовании блокировки неканонического ввода-вывода.См. Блокировка Linux против последовательного чтения без блокировки

0 голосов
/ 05 июня 2019

Если вы имеете в виду POSIX ssize_t read(int fildes, void *buf, size_t nbyte), нет.Не существует стандартного способа установить минимальное количество байтов равным read().(Я не могу исключить некоторые реализации, обеспечивающие возможность, но я не знаю ни о каких, и по причинам, которым я должен следовать, я вижу смысл в предоставлении такой возможности для read() в целом.)

И по очень веской причине: что произойдет, если байты закончатся до того, как будет выполнено запрошенное число?Другой конец канала закрывается, сокет, из которого вы читаете, закрывается, или вы нажимаете на конец файла, из которого читаете, до достижения запрошенного числа байтов.

Что должно read() тогда?Заблокировать навсегда ожидание байтов, которые либо могут никогда, либо не могут прибыть?В этом случае единственное разумное действие для read() - вернуть количество прочитанных байтов.

Таким образом, в общем случае вы все равно должны обрабатывать частичные read() результаты, заставляя «читать минимальное число».байтов "установка бессмысленная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...