我正在编写一个单线程 Cocoa 应用程序并尝试使用NSNotificationCenter
实用程序方法(因为这似乎是可可中的工作方式)来执行非阻塞 IO。
除了文件句柄关闭时,一切似乎都正常。它最终会通知我,但它需要很长时间。谁能解释为什么会这样?
更具体地说,我正在编写一个分叉进程并读取其标准输出的屏幕保护程序。行为也会根据上下文发生变化。当它在“系统偏好设置”的预览窗口中运行时,它会更快地通知关闭,然后在单击测试按钮时全屏运行。
编辑:经过一番思考,我相信问题在于最后一次写入和关闭几乎同时发生。最后一次读取发生在NSFileHandle
关闭之后,它返回数据(即不在 EOF 处)。我通过等待它完成,但由于文件句柄处于非活动状态,主循环将保持阻塞,因为没有任何信号通知它执行。预览模式起作用的原因是,每当我单击“系统偏好设置”窗口中的某些内容时,我都会强制执行主循环,它会检查NSFileHandle
正在等待的状态并看到它已关闭。
现在我想我知道发生了什么,但我仍然不知道如何弄清楚它是在NSFileHandle
没有阻塞的情况下关闭的!
经过更多测试后,此问题似乎是屏幕保护程序执行时独有的。