在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()
来设置这些选项[C
和API
]。我检查了fcntl()
和open()
人,但找不到匹配的标志。
答案 0 :(得分:2)
在Linux命令
stty
中,我们可以使用min选项设置最小N个字符。是否可以使用fcntl()或任何C API设置这些选项(“分钟和时间”)。
stty
命令仅仅是访问(串行终端的)termios接口的命令。
您可以通过编程方式使用 tcgetattr()和 tcsetattr()。
请参见Setting Terminal Modes Properly 和Serial 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()
的结果,从而使“读取最小字节数”设置毫无意义。