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