如何在C语言中实现(char-ready?)

9

我目前正在使用C语言实现Scheme R5RS,并且在尝试实现(char-ready?)函数时遇到了困难。

以下是该函数的规格说明。该函数保证不会阻塞。当没有准备好输入时,标准C函数(如fgetc())都会在调用时阻塞。

有人知道是否有一种好的简单方法来实现它,而不需要生成专用的IO线程吗?

编辑: 我的输入流类型是FILE*,可以是stdin或使用fopen()打开的文件。

(char-ready?)过程

(char-ready? port)过程

如果输入端口已经准备好一个字符则返回#t,否则返回#f。如果char-ready返回#t,则保证在给定端口上进行的下一个read-char操作不会挂起。如果端口在文件结束处,则char-ready?返回#t。可以省略port参数,此时它默认为current-input-port返回的值。

理由:

char-ready?存在的目的是使程序能够从交互端口接受字符而无需等待输入。与此类端口相关联的任何输入编辑器都必须确保通过char-ready?断言存在的字符不能被擦除。如果char-ready?在文件结束处返回#f,则文件结束的端口将与没有准备好字符的交互端口不可区分。

3个回答

5

您需要深入到stdio级别以下。在UNIX上,您可以使用fileno()函数获取与流相关联的文件描述符,然后可以使用select()read()系统调用进行非阻塞读取。


2

2
也许可以参考这个答案中的代码?但请注意,使用ungetc时“只保证一个推回操作”。

顺便说一下,大多数严肃的scheme实现最终会执行自己的缓冲(可能是非阻塞)IO操作。


是的,我忘记了阻塞部分。无论如何,请注意第二个评论——FILE*在长期内可能会变得不太有用,你将会转而自己完成更多的事情。(假设你希望它不仅仅是一个玩具。) - Eli Barzilay

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