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

时间:2011-06-01 19:56:02

标签: c io scheme

我目前正在使用C语言实现Scheme R5RS,并且我一直试图实现(char-ready?)函数。

我有下面引用的功能的规格。该功能保证不会阻止。当没有输入就绪时,fgetc()之类的标准C函数在调用时都会阻塞输入。

有没有人知道是否有办法以一种简单的方式实现这一点,而不会产生专用的IO线程?

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

  

(char-ready?)程序

     

(char-ready?port)程序

     

如果输入端口上的字符已就绪,则返回#t,否则返回#f。如果char-ready返回#t,则保证给定端口上的下一个read-char操作不会挂起。如果端口位于文件末尾,那么char-ready?返回#t。端口可以​​省略,在这种情况下,它默认为current-input-port返回的值。

     

理由:

     

炭火准备好了吗?存在使程序可以从交互式端口接受字符而不会卡住等待输入。与此类端口关联的任何输入编辑器必须确保其字符的存在已由char-ready声明?不能擦掉。准备好了吗?要在文件末尾返回#f,文件末尾的端口将与没有就绪字符的交互式端口无法区分。

3 个答案:

答案 0 :(得分:5)

你需要低于stdio级别。在UNIX上,您可以使用fileno()来获取与流关联的文件描述符,然后您可以使用select()read()系统调用来执行非阻塞读取。

答案 1 :(得分:2)

也许这个解决方案适合您:How to check if stdin is still opened without blocking?

答案 2 :(得分:2)

也许像this answer中的代码?但请注意ungetc“只保证一次推迟”。

作为旁注,大多数严重的方案实现最终会执行自己的缓冲(可能是非阻塞)IO。