让fgets在Linux上发出更长的read()调用

我正在阅读使用fgets相当大的文本(高达128K)的文本。 我看到服务器上的过度的上下文切换,使用strace我看到以下内容:

 read(3, "9005 10218 00840023102015 201008"..., 4096) = 4096 

fgets读取4096个字节的块。 有没有什么办法来控制fgets调用read()时使用的大块?

Solutions Collecting From Web of "让fgets在Linux上发出更长的read()调用"

setvbuf将是明显的起点。

函数fgets()是stdio包的一部分,因此它必须以与使用fgetc()fscanf()fread()等一致的方式来缓冲(或不)输入流。 这意味着缓冲区本身(如果流被缓冲)是FILE对象的属性。

通过调用setvbuf() ,可以向库提示是否存在缓冲区,如果缓冲区大小缓冲区大小。

图书馆的实施有相当大的自由度来忽略暗示,并且做它认为最好的,但是通常会接受两个“合理”的权力的缓冲区。 你已经注意到了,默认值是4096,显然比最优的要小。

如果在实际文件上打开,流将默认缓冲。 它的缓冲管道,FIFO,TTY或其他任何可能有不同的默认值。