scanf如何判断是否阻塞?
How does scanf determine whether to block?
当我从命令行使用 MyProgram < cl.txt
命令将文件重定向到 stdin
时,scanf
s 没有等待我按 Enter。
但是当我在我的程序中使用 scanf
而没有这样做时,它会阻塞直到按下回车键。
它究竟是如何确定的?它会一直读取流直到遇到 \n
吗?还是真的等我按键?
当我不写任何东西并按 Enter 时,它也不会停止阻塞并继续询问。我真的很困惑。
当您调用 scanf 时,它会立即等待输入。在您的第一个示例中,输入以 "cl.txt" 的形式提供。在您的第二个示例中,在您按下某个键之前不会提供任何输入。同步 IO 将阻塞其执行线程,直到它接收到输入。
Does it keep reading the stream until '\n' is encountered?
通常 stdin
处于行缓冲模式(_IOLBF
,参见 setvbuf)。每当缓冲区为空时,stdin 等待输入一个全新的行,即等到您按 Enter 并将 \n
插入缓冲区:
On Input, the buffer is filled up to the next newline character when an input operation is requested and the buffer is empty.
注意:控制台(终端)通常会自行实现缓冲,并且在您按 Enter 之前不会向流发送任何数据 - 这允许您编辑数据(例如使用删除和退格键密钥),然后再将它们发送到应用程序。因此,即使 stdin
端没有缓冲(比如当您执行 setvbuf(stdin, NULL, _IONBF, 0)
时),scanf
可能仍会等待,直到按下 Enter。
scanf
只是从它的输入流中读取。如果输入流是一个管道,并且该管道的另一端与一个 tty 相关联(如果您通过键盘上的按键以交互方式输入数据,通常就是这种情况),scanf 将 return它读取完成其格式字符串(或不匹配)的数据。然而,如果 tty 处于熟化模式(这是默认模式,除非您努力将 tty 置于原始模式,否则您应该假设它正在熟化您键入的内容),则不会将任何数据写入管道直到你点击 return.
换句话说,阻塞的不是你的scanf。 (好吧,它是阻塞的,但它不是延迟的根源。)相反,tty 驱动程序在将任何数据传递给您的程序之前等待您点击 return。
当我从命令行使用 MyProgram < cl.txt
命令将文件重定向到 stdin
时,scanf
s 没有等待我按 Enter。
但是当我在我的程序中使用 scanf
而没有这样做时,它会阻塞直到按下回车键。
它究竟是如何确定的?它会一直读取流直到遇到 \n
吗?还是真的等我按键?
当我不写任何东西并按 Enter 时,它也不会停止阻塞并继续询问。我真的很困惑。
当您调用 scanf 时,它会立即等待输入。在您的第一个示例中,输入以 "cl.txt" 的形式提供。在您的第二个示例中,在您按下某个键之前不会提供任何输入。同步 IO 将阻塞其执行线程,直到它接收到输入。
Does it keep reading the stream until '\n' is encountered?
通常 stdin
处于行缓冲模式(_IOLBF
,参见 setvbuf)。每当缓冲区为空时,stdin 等待输入一个全新的行,即等到您按 Enter 并将 \n
插入缓冲区:
On Input, the buffer is filled up to the next newline character when an input operation is requested and the buffer is empty.
注意:控制台(终端)通常会自行实现缓冲,并且在您按 Enter 之前不会向流发送任何数据 - 这允许您编辑数据(例如使用删除和退格键密钥),然后再将它们发送到应用程序。因此,即使 stdin
端没有缓冲(比如当您执行 setvbuf(stdin, NULL, _IONBF, 0)
时),scanf
可能仍会等待,直到按下 Enter。
scanf
只是从它的输入流中读取。如果输入流是一个管道,并且该管道的另一端与一个 tty 相关联(如果您通过键盘上的按键以交互方式输入数据,通常就是这种情况),scanf 将 return它读取完成其格式字符串(或不匹配)的数据。然而,如果 tty 处于熟化模式(这是默认模式,除非您努力将 tty 置于原始模式,否则您应该假设它正在熟化您键入的内容),则不会将任何数据写入管道直到你点击 return.
换句话说,阻塞的不是你的scanf。 (好吧,它是阻塞的,但它不是延迟的根源。)相反,tty 驱动程序在将任何数据传递给您的程序之前等待您点击 return。