ncurses中nodelay()和cbreak()之间有什么区别?

ncurses中nodelay()和cbreak()之间有什么区别?,c,ncurses,C,Ncurses,ncurses中的nodelay()和cbreak()之间有什么区别?为什么要使用这些函数,因为我们有getch()!如果我了解getch()允许在用户按下键后直接获取键。所以nodelay和cbreak是没有用的,不是吗?它们是两个完全不同的函数 从文件中: 通常,tty驱动程序缓冲键入的字符,直到键入换行符或回车符。cbreak例程禁用行缓冲和擦除/终止字符处理(中断和流控制字符不受影响),使用户键入的字符立即可供程序使用。NOCREAK例程将终端返回到正常(烹饪)模式 nodelay选项

ncurses中的
nodelay()
cbreak()
之间有什么区别?为什么要使用这些函数,因为我们有
getch()
!如果我了解
getch()
允许在用户按下键后直接获取键。所以
nodelay
cbreak
是没有用的,不是吗?

它们是两个完全不同的函数

从文件中:

通常,tty驱动程序缓冲键入的字符,直到键入换行符或回车符。cbreak例程禁用行缓冲和擦除/终止字符处理(中断和流控制字符不受影响),使用户键入的字符立即可供程序使用。NOCREAK例程将终端返回到正常(烹饪)模式

nodelay选项使getch成为非阻塞调用。如果没有准备好输入,getch将返回ERR。如果禁用(bf为FALSE),则getch将等待按键

因此,
cbreak
是指如果您想禁用行缓冲,出于许多原因,您可能需要禁用行缓冲。一种是避免在每次打印输出后使用
fflush(stdout)
。在启用行缓冲的情况下,在打印换行符之前,通常不会在屏幕上看到打印输出


nodelay
的描述是不言自明的
getch
不会等待,但如果按下或不按下任何键,它会立即返回而不受影响。

所以cbreak()禁用行缓冲,但我们处于阻塞模式,nodelay()特别导致getch是一个非阻塞调用?好的,但我不明白为什么在执行该代码=>int main(void){initscr();printw(“Blah”);refresh();while(1);}虽然我没有使用cbreak?否,但printw在每次打印输出(或具有相同效果的其他内容)后都会刷新,这与printf的情况不同。或者可能不是这样。我真的不知道。这里一个重要的事情是,这是一个典型的事情,它的工作方式,他们应该大部分时间。我在这里尝试了完全相同的代码:但我没有设法重现这个问题。