【发布时间】: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 库,这就是我制作自己的东西的原因。
-
你可以为自己写一个答案,解释未来人们从网络搜索中登陆时会发生什么