有没有一种方法可以使用fcntl()设置每次读取的最小字符数?

时间:2019-06-05 20:18:27

标签: c linux serial-port

在Linux命令stty中,我们可以使用选项min为完成的读取设置最少N个字符。

从笨拙的人

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()来设置这些选项[CAPI]。我检查了fcntl()open()人,但找不到匹配的标志。

2 个答案:

答案 0 :(得分:2)

  

在Linux命令stty中,我们可以使用min选项设置最小N个字符。

     

是否可以使用fcntl()或任何C API设置这些选项(“分钟和时间”)。

stty命令仅仅是访问(串行终端的)termios接口的命令。
您可以通过编程方式使用 tcgetattr() tcsetattr()

请参见Setting Terminal Modes ProperlySerial Programming Guide for POSIX Operating Systems


示例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值仅在使用阻塞非规范I / O时有效。参见Linux Blocking vs. non Blocking Serial Read

答案 1 :(得分:0)

假设您的意思是the POSIX ssize_t read(int fildes, void *buf, size_t nbyte),否。没有标准方法将最小字节数设置为read()。 (我不能排除某些提供此功能的实现,但是我不知道有任何实现,也没有出于以下原因,我认为通常为read()提供这种功能很有意义。)

有一个很好的理由:如果在满足请求的数量之前字节用完了怎么办?管道的另一端被关闭,正在读取的套接字被关闭,或者在达到请求的字节数之前碰到了正在读取的文件的末尾。

read()应该怎么做?永远阻止等待可能永远不会到达的字节吗?在这种情况下,唯一明智的操作是让read()返回已读取的字节数。

因此,通常来说,无论如何,您都必须处理部分read()的结果,从而使“读取最小字节数”设置毫无意义。