read(2)在哪里检查termios结构以确定它应该以(非)阻塞的方式读取STDIN?
在Linux内核中TTY的实现。相关文件
https://docs.kernel.org/driver-api/tty/index.html
.
首先,我们需要来自的宏
https://elixir.bootlin.com/linux/latest/source/include/linux/tty.h#L40
:
#define TIME_CHAR(tty) ((tty)->termios.c_cc[VTIME])
#define MIN_CHAR(tty) ((tty)->termios.c_cc[VMIN])
看起来这里使用了VMIN和VTIME
https://elixir.bootlin.com/linux/latest/source/drivers/tty/n_tty.c#L2212
:
minimum = time = 0;
timeout = MAX_SCHEDULE_TIMEOUT;
if (!ldata->icanon) {
minimum = MIN_CHAR(tty);
if (minimum) {
time = (HZ / 10) * TIME_CHAR(tty);
} else {
timeout = (HZ / 10) * TIME_CHAR(tty);
minimum = 1;
}
}
......
timeout = wait_woken(&wait, TASK_INTERRUPTIBLE,
timeout);
......
if (kb - kbuf >= minimum)
break;
if (time)
timeout = time;