我正在为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?
}
答案 0 :(得分:0)
请不要以libio为例。这段代码是在90年代中期编写的,旨在与C ++运行时库(libstdc ++)共享。结果,代码以奇怪的样式编写,基本上是C ++ streambuf
类的手动翻译。现在,出于ABI兼容性的原因,我们坚持使用它,以便人们可以运行他们真正非常古老的C ++软件(并且仍然可以运行)。
可悲的是,从那以后,C ++ ABI继续发展并以不兼容的方式进行了数次更改,然后才最终决定使用C ++ Itanium ABI(它仍然与glibc中的产品不兼容)。