代码之家  ›  专栏  ›  技术社区  ›  rb612

setbuf只影响stdio调用,而不影响系统调用?

  •  0
  • rb612  · 技术社区  · 7 年前

    我想更深入地了解缓冲是如何工作的 C stdio this 但我想确认我的理解是正确的。

    当我使用 fgets stdbuf -i3 )并检查 strace ,我看到阅读是以3个字符为一组进行的,我希望:

    read(0, "hel", 3)                       = 3
    read(0, "lo\n", 3)                      = 3
    ...
    

    如果我还用 stdbuf read(2) 取而代之的是系统调用,它一次读取全部内容(最多4096字节):

    read(0, "hello\nworld!\n\n", 4096)      = 14
    

    stdbuf公司 打电话来。

    斯特迪奥 斯特迪奥 stdbuf-i3型 stdbuf -i0 会使管道的容量以某种方式不能容纳超过一个字节(即。 write(2) 调用将在发送 stdout 到进程的无缓冲区 stdin

    所以说有两个缓冲区位于实际的管道缓冲区之上,而另一个缓冲区 标准输出 ? 以及 setbuf 只控制这两个缓冲区,而不是修改关于内核管道缓冲区的任何属性。所以设置 成为一个 n 字节缓冲区意味着它将保留 在返回内核执行 read 系统调用。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Jonathon Reinhart    7 年前

    缓冲只存在于LIBC中,您从STDIO调用的函数。syscall接口上没有缓冲区。如果您进行系统调用(使用。 read write ),在调用内核之前,libc包装器通常只做很少的事情。

    这个 documentation for stdbuf

    command 必须以程序名开头。。。使用ISO C文件流进行输入/输出(注意程序 dd cat 别那么做,

    这是因为 stdbuf works 通过将库预加载到目标程序中(在其libc中)来更改缓冲模式。直接进行系统调用的程序不受影响。

    stdbuf公司 不更改内核中管道缓冲区的大小。这个缓冲区与libc提供的缓冲无关。


    对。Libc为stdio.h提供缓冲区 FILE 溪流。