像scanf,getc这样的输入函数是如何工作的?当一个程序被调用,并且执行到达scanf时,它停止等待输入。它是从输入缓冲区开始阅读,直到读取回车键的代码,还是函数实现依赖于特定的系统调用或中断机制?我的意思是操作系统是如何参与进来的?我在网上搜索了一下,读了几本书,但都没有很好地解释这一点。
dxxyhpgq1#
基本上,stdio函数的工作方式是维护缓冲区(一个一定大小的char数组,通常带有“head”和“tail”指针,用于跟踪缓冲区的哪个部分有效/正在使用)。它们对缓冲区中的数据进行操作(从缓冲器读取的输入函数,输出函数写入缓冲区),并在缓冲区为空或满时,或者在输入和输出之间切换FILE时,调用较低级别的OS函数来填充或刷新缓冲区。因此,对于getc,如果缓冲区为空,它将调用一个OS函数以将一些数据放入缓冲区,然后返回缓冲区中的第一个字符(将指针前移,以便后续的getc调用将从缓冲区返回后续字符)。在scanf的情况下,它将缓冲区中的数据与格式字符串匹配,如果匹配就消耗它(前进指针)。如果缓冲区中没有足够的数据,它将调用操作系统函数来获取更多。类似地,当printf被调用时,数据将被写入缓冲区,并且直到缓冲区被刷新时才调用实际写入数据的OS函数。您可以调用setvbuf来控制输出缓冲--您可以将其设置为“unbuffered”(这实际上没有消除缓冲器,仅使缓冲器在每次调用之后被刷新)或“行缓冲”(每当写入X1 M5 N1 X(换行符)字符时刷新缓冲器。
char
getc
scanf
printf
setvbuf
1条答案
按热度按时间dxxyhpgq1#
基本上,stdio函数的工作方式是维护缓冲区(一个一定大小的
char
数组,通常带有“head”和“tail”指针,用于跟踪缓冲区的哪个部分有效/正在使用)。它们对缓冲区中的数据进行操作(从缓冲器读取的输入函数,输出函数写入缓冲区),并在缓冲区为空或满时,或者在输入和输出之间切换FILE时,调用较低级别的OS函数来填充或刷新缓冲区。因此,对于
getc
,如果缓冲区为空,它将调用一个OS函数以将一些数据放入缓冲区,然后返回缓冲区中的第一个字符(将指针前移,以便后续的getc调用将从缓冲区返回后续字符)。在scanf
的情况下,它将缓冲区中的数据与格式字符串匹配,如果匹配就消耗它(前进指针)。如果缓冲区中没有足够的数据,它将调用操作系统函数来获取更多。类似地,当
printf
被调用时,数据将被写入缓冲区,并且直到缓冲区被刷新时才调用实际写入数据的OS函数。您可以调用setvbuf
来控制输出缓冲--您可以将其设置为“unbuffered”(这实际上没有消除缓冲器,仅使缓冲器在每次调用之后被刷新)或“行缓冲”(每当写入X1 M5 N1 X(换行符)字符时刷新缓冲器。