我目前正在使用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,文件末尾的端口将与没有就绪字符的交互式端口无法区分。
答案 0 :(得分:5)
你需要低于stdio级别。在UNIX上,您可以使用fileno()
来获取与流关联的文件描述符,然后您可以使用select()
和read()
系统调用来执行非阻塞读取。
答案 1 :(得分:2)
答案 2 :(得分:2)
也许像this answer中的代码?但请注意ungetc
“只保证一次推迟”。
作为旁注,大多数严重的方案实现最终会执行自己的缓冲(可能是非阻塞)IO。