5

我正在使用fgets. 我在服务器上看到过多的上下文切换,使用strace我看到以下内容:

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

fgets一次读取 4096 字节的块。fgets有什么方法可以控制调用时使用的大块read()

4

2 回答 2

7

setvbuf将是显而易见的起点。

于 2010-08-31T19:18:20.307 回答
2

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

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

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

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

于 2010-09-01T02:19:36.583 回答