getchar() 如何与 stdio 流同步?

How getchar() gets synchronized with stdio stream?

根据getchar() 的功能,当stdio 流缓冲区为空时需要阻塞它。这个拦截功能是如何实现的?

并且据说getchar/getc出于性能原因可以实现为宏(直接汇编),在这种情况下如何确保阻塞功能。

阻塞由 OS 内核负责。如果无法实现该操作,则内​​核将进程放入等待队列,使其不符合条件,直到检测到相应的事件(至少有一个字符可用于输入)。

实现为宏与阻塞没有什么特别的关系。这只是意味着它不是函数,因此您无法获取它的地址。注意宏并不意味着直接汇编,它意味着 C 宏类似于:

#define getchar(void) fgetc(stdin)