setvbuf() - 当 buf 为 NULL 时的大小参数

发布于 2024-11-09 12:07:00 字数 374 浏览 2 评论 0原文

看起来,当我运行以下代码时:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv)
{
    int i=0;

    setvbuf(stdout, NULL, _IOLBF,0);

    while (1)
            printf("%d ",i++);

    return 0;
}

它会以 1024 个字符的块形式打印,无论我为 setvbuf() 定义的大小。 问题是在这种情况下 size 是否会产生某种影响,以及 1024 个字符的定义来自哪里。

It seems that when I run the following code:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv)
{
    int i=0;

    setvbuf(stdout, NULL, _IOLBF,0);

    while (1)
            printf("%d ",i++);

    return 0;
}

it prints in chunks of 1024 chars, no matter the size I define for setvbuf().
The question is is if size affects somehow in this case and where is the definition for 1024 chars is coming from.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

很糊涂小朋友 2024-11-16 12:07:00

我不知道您是如何识别 1024 的,但它可能是 BUFSIZBUFSIZstdio.h 中定义。

如果 buf 为 NULL,则为 stdio 库
自动分配缓冲区
与流一起使用(除非我们选择
无缓冲 I/O)。

编辑

这是glibc所说的:

宏:int BUFSIZ
该宏的值是一个整型常量表达式,即
适合用于尺寸参数
setvbuf。该值保证
至少 256

BUFSIZ的值是在每个系统上选择的,以便进行流I/O
高效的。所以使用它是一个好主意
BUFSIZ 作为缓冲区的大小
你调用setvbuf。

编辑2

@larsmans 是对的。我研究了 setvbuf 的实现方式,它在请求行缓冲并呈现 NULL buf 时忽略调用。现在,stdout 不是普通文件,它附加到终端。因此,前往 pixelbeat

  • 缓冲区大小仅直接影响缓冲模式
  • 像内核一样的默认大小是基于页面大小(4096 字节)
    我的系统)
  • 如果 stdin/stdout 连接到终端,则默认大小 = 1024;
    否则大小= 4096

I don't know how you identified 1024 but it's probably BUFSIZ. BUFSIZ is defined in stdio.h.

If buf is NULL, then the stdio library
automatically allocates a buffer for
use with stream (unless we select
unbuffered I/O).

EDIT

Here's something glibc says:

Macro: int BUFSIZ
The value of this macro is an integer constant expression that is
good to use for the size argument to
setvbuf. This value is guaranteed to
be at least 256.

The value of BUFSIZ is chosen on each system so as to make stream I/O
efficient. So it is a good idea to use
BUFSIZ as the size for the buffer when
you call setvbuf.

EDIT 2

@larsmans is right. I looked at how setvbuf is implemented and it ignores a call when asking for line buffering and presenting a NULL buf. Now, stdout is no ordinary file, it's attached to a terminal. So, heading over to pixelbeat

  • Buffer size only directly affects buffered mode
  • The default size like the kernel is based on the page size (4096 bytes on
    my system)
  • if stdin/stdout are connected to a terminal then default size = 1024;
    else size = 4096
深爱不及久伴 2024-11-16 12:07:00

根据C标准(草案),

如果 buf 不是空指针,则可以使用它指向的数组来代替 setvbuf 函数和参数 size< 分配的缓冲区< /code> 指定数组的大小;否则,size可以确定由setvbuf函数分配的缓冲区的大小。 [强调已添加。]


所以,假设你测量正确,当 buf 为 null 时,Glibc 似乎可以自由地做它想做的事,并且它给你一个 1kB 的缓冲区。由于您从不写入换行符,因此行缓冲没有任何效果,并且行为类似于完全缓冲。

According to the (draft) C standard,

If buf is not a null pointer, the array it points to may be used instead of a buffer allocated by the setvbuf function and the argument size specifies the size of the array; otherwise, size may determine the size of a buffer allocated by the setvbuf function. [Emphasis added.]

So, assuming you measured correctly, it seems like Glibc is free to do as it pleases when buf is null, and it gives you a 1kB buffer. Since you never write a newline, line buffering has no effect and the behavior is similar to full buffering.

自此以后,行同陌路 2024-11-16 12:07:00

大小对于 NULL buf 指针可能没有太大影响。

但是,您仍然使用 _IOLBF 请求缓冲输出,请尝试使用 _IONBF

http://en.wikipedia.org/wiki/Setvbuf

The size probably doesn't have much effect for a NULL buf pointer.

However, you are still requesting buffered output with _IOLBF Try _IONBF instead.

http://en.wikipedia.org/wiki/Setvbuf

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文