在 Smalltalk 中读取超时的文件流(命名管道)

Posted

技术标签:

【中文标题】在 Smalltalk 中读取超时的文件流(命名管道)【英文标题】:Read a filestream (named pipe) with a timeout in Smalltalk 【发布时间】:2014-01-09 15:23:53 【问题描述】:

我也将它发布到了 Squeak Beginners 列表中 - 我一定会确保从那里得到任何答案 :)

我正在使用 Squeak 4.2 并在命名管道连接的 smalltalk 端工作,它向命名管道服务器发送一条消息:

    msg := 'Here''s Johnny!!!!'. 
    pipe nextPutAll: msg; flush. 

然后它应该会收到一个确认,这将是收到消息的 32 字节 md5 哈希(然后 smalltalk 应用程序可以验证)。命名管道服务器可能已经消失或无法处理请求,因此我想在读取确认时设置超时。我试过用这个:

    ack := [ pipe next: 32 ] valueWithin: (Duration seconds: 3) onTimeout: [ 'timeout'. ]. 

然后人为地让管道服务器暂停以测试代码。但是 smalltalk 线程在读取时阻塞并且不会继续(即使在超时之后),尽管如果我让管道服务器发送正确的响应(例如,在 5 秒延迟之后),'ack 的值' 是'超时'。显然,超时完成了它应该做的事情,但无法“解锁”管道上的阻塞读取。

即使使用阻塞的 FileStream 读取,有没有办法做到这一点?如果可能的话,我宁愿避免忙着等待有 32 个字符可用。

【问题讨论】:

仅供参考,我从未找到满意的答案。我使用命名管道的原因是启动套接字服务器会引发防火墙警告。但是,我然后发现将套接字服务器绑定到 127.0.0.1(而不是默认的 0.0.0.0)不会触发警告 - 至少在 Windows 平台上是这样。所以,问题,呃,避免了。 【参考方案1】:

这个可能会派上用场,但恐怕在 Windows 上不行。

http://www.samadhiweb.com/blog/2013.07.27.unixdomainsockets.html

【讨论】:

以上是关于在 Smalltalk 中读取超时的文件流(命名管道)的主要内容,如果未能解决你的问题,请参考以下文章

java对文本文件进行操作:读取修改添加删除重命名等

C++学习笔记:高级编程:文件和流,异常处理,动态内存,命名空间

从输入流Java读取时有没有办法超时? [复制]

IO流

C/C++中如何将文件读取为二进制数据到数组中,再从数组中读取二进制流还原为文件,主要是后一步

在java中创建命名管道