使fgets在linux上发出更长的read()调用

时间:2010-08-31 19:14:17

标签: c linux stdio

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

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

即。 fgets一次读取4096字节的块。有没有办法控制fgets在调用read()时使用的大块数?

2 个答案:

答案 0 :(得分:7)

setvbuf将是明显的起点。

答案 1 :(得分:2)

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

是否有缓冲区,如果缓冲,缓冲区有多大,可以通过调用setvbuf()向库建议。

库实现具有相当大的自由度来忽略提示并做它认为最好的,但通常会接受大小为2的“合理”幂的缓冲区。您已经注意到默认值为4096,明显小于最佳值。

如果在实际文件上打开了流,则默认情况下会缓冲该流。它在管道,FIFO,TTY或其他任何可能具有不同默认值的缓冲。