我正在使用fgets
. 我在服务器上看到过多的上下文切换,使用strace
我看到以下内容:
read(3, "9005 10218 00840023102015 201008"..., 4096) = 4096
即fgets
一次读取 4096 字节的块。fgets
有什么方法可以控制调用时使用的大块read()
?
setvbuf
将是显而易见的起点。
该函数fgets()
是 stdio 包的一部分,因此它必须以与 using fgetc()
、fscanf()
等一致的方式缓冲(或不缓冲)输入流fread()
。这意味着缓冲区本身(如果流被缓冲)是FILE
对象的属性。
是否有缓冲区,如果有缓冲区,缓冲区有多大,可以通过调用向库建议setvbuf()
。
库实现有相当大的自由度来忽略提示并做它认为最好的事情,但是通常会接受大小为 2 的“合理”幂的缓冲区。您已经注意到默认值为 4096,它明显小于最佳值。
如果在实际文件上打开流,则默认情况下会缓冲该流。它在管道、FIFO、TTY 或其他任何东西上的缓冲可能具有不同的默认值。