【问题标题】:Basic implementation of buffered I/O缓冲 I/O 的基本实现
【发布时间】:2018-12-21 10:57:34
【问题描述】:

我正在为 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?
}

【问题讨论】:

  • 基本上就是这样。这是如此简单的任务,我想不存在“伪代码”。只需阅读更简单的 libc 实现,如 newlib,如代码 here,与您的完全相同(即检查完整缓冲区然后刷新,将字符添加到缓冲区,如果缓冲区已满或行缓冲和换行符,然后刷新)。
  • 谢谢!试图理解 libc,我的思绪融化了,这大大简化了它。 @JonathanLeffler:D 对一切都使用 C 库,这就是我制作自己的东西的原因。
  • 你可以为自己写一个答案,解释未来人们从网络搜索中登陆时会发生什么

标签: c linux d glibc


【解决方案1】:

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

可悲的是,从那时起,C++ ABI 已经向前发展并以不兼容的方式进行了多次更改,然后最终选择了 C++ Itanium ABI(它仍然与我们在 glibc 中的内容不兼容)..

【讨论】:

    猜你喜欢
    • 2015-07-05
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2015-08-20
    • 1970-01-01
    • 2011-07-22
    相关资源
    最近更新 更多