缓冲I / O的基本实现

时间:2018-07-13 06:17:48

标签: c linux d glibc

我正在为D创建一个自定义的缓冲I / O库(除去对C的依赖)。我查看了libc的来源,并设法找到_IO_file_xsputn。但是我不确定从那里去哪里。从我所看到的,它检查输入长度并将数据复制到缓冲区中。但是我不确定从那里去哪里。是否存在类似于伪代码的表达式,说明如何实现缓冲的I / O?这是我对类似puts的缓冲函数的猜测:

if (buf.length - pos /* available space */  < data.length) {
    flush
    syscall::write the whole input data
} else {
    add data to buf (memcpy, pos += data.length)
    if (data contains '\n')
        flush upto '\n' // Maybe whole buffering instead?
}

1 个答案:

答案 0 :(得分:0)

请不要以libio为例。这段代码是在90年代中期编写的,旨在与C ++运行时库(libstdc ++)共享。结果,代码以奇怪的样式编写,基本上是C ++ streambuf类的手动翻译。现在,出于ABI兼容性的原因,我们坚持使用它,以便人们可以运行他们真正非常古老的C ++软件(并且仍然可以运行)。

可悲的是,从那以后,C ++ ABI继续发展并以不兼容的方式进行了数次更改,然后才最终决定使用C ++ Itanium ABI(它仍然与glibc中的产品不兼容)。