在Chicken Scheme中的缓冲I/O?

5
Racket有一个不错的函数read-bytes-async!,我相信这个函数在全世界的其他编程语言中都存在。它从输入流中读取尽可能多的数据到缓冲区中,而不会阻塞,并返回写入的字节数。
这个函数似乎是实现Unix cat工具的关键函数,但是Chicken Scheme似乎缺少这样的函数。当然,我可以使用(read-byte)(write-byte),但这很慢,而且会占用所有CPU。
甚至连(copy-port)函数似乎也没有这样的实现。在流关闭之前,数据只有在填满缓冲区时才以缓冲区为单位进行复制。这意味着(copy-port (current-input-port) (current-output-port))根本就不像cat
我是否只是在阅读文档时发生了可怕的盲点,还是说Chicken实际上真的缺乏这样的函数?因此,在Chicken中无法有效地编写 cat吗?

这篇2005年的邮件列表帖子可能已经过时,但提到“目前stdio和文件的I/O是完全阻塞的”。 - Joshua Taylor
无论如何,我要删除这个问题。posix 库有一个低级函数可以实现我想要的功能。邮件列表帖子似乎非常过时! - ithisa
2个回答

5
我解决了我的问题。 posix库有一个file-read功能,可以实现我想要的功能,尽管是在文件描述符上。幸运的是,Chicken中的端口只是围绕文件描述符的薄包装器; posix库中也有一个端口到文件描述符转换器。
有趣的是,这些函数在Windows上也可以工作。 posix似乎不限于POSIX系统。

这可以用来在STDIN上进行非阻塞读取,例如? - Alexej Magura
1
它的行为类似于Unix/大多数其他语言的read()函数。也就是说,等待直到有可用数据,并将可用数据读入缓冲区,返回读取的数据长度。Chicken的默认I/O执行一些奇怪的操作:在返回之前等待整个缓冲区被填满。这使得实现大多数类似“cat”的程序变得不可能。 - ithisa
我最近找到了一种方法,可以通过使用外部 C 函数来进行文件 I/O,通过 Chicken 强大的 C-接口能力实现。 - Alexej Magura

2

正如你所说,posix单元是关键,但对于你的问题,更相关的是set-buffering-mode!

这适用于任何端口。


不,那与我想要的不相关。我的意思是使用自己的缓冲区,而不是端口缓冲区。即使端口被缓冲,逐个字符复制仍然非常慢。 - ithisa
如果你使用了http://wiki.call-cc.org/eggref/4/byte-blob中的byte-blob-read呢? - ramrunner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接