我也把它发布到了吱吱初学者列表中——我一定会确保那里的任何答案都能在这里得到:)
我正在使用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"的值是"timeout"。显然,超时完成了它应该做的事情,但无法"解锁"管道上的阻塞读取。
有没有一种方法可以实现这一点,即使使用阻塞的FileStream读取?如果可能的话,我宁愿在有32个字符可用的情况下避免繁忙的等待。
这个可能会派上用场,但恐怕在Windows上不会。
http://www.samadhiweb.com/blog/2013.07.27.unixdomainsockets.html