私はシングル スレッドの Cocoa アプリを作成しており、NSNotificationCenter
非ブロッキング IO を実行するためにユーティリティ方法論 (ココアでの処理方法のようです) を使用しようとしています。
ファイル ハンドルが閉じている場合を除いて、すべて正常に動作しているようです。最終的には通知されますが、永遠にかかります。これがなぜなのか、誰か説明できますか?
より具体的には、プロセスをフォークしてその標準出力を読み取るスクリーン セーバーを作成しています。コンテキストに基づいて動作も変化します。システム環境設定のプレビュー ウィンドウで実行しているときは、テスト ボタンをクリックしたときにフル スクリーンで実行するときよりも、閉じるときに通知が速くなります。
編集:少し考えた後、問題は最後の書き込みとクローズがほぼ同時に発生することだと思います。が閉じられた後に最後の読み取りがNSFileHandle
行われ、データが返されます (つまり、EOF ではない)。私はそれを待って終了しますが、ファイルハンドルが非アクティブであるため、実行するように通知するものがないため、メインループはブロックされたままになります。プレビュー モードが機能する理由は、[システム環境設定] ウィンドウで何かをクリックするたびに、メイン ループを強制的に実行し、NSFileHandle
待機中の状態をチェックして閉じていることを確認するためです。
これで何が起こっているのかがわかったと思いますが、NSFileHandle
ブロックせずに が閉じていることを理解する方法はまだわかりません!
さらにテストを行った結果、この問題はスクリーン セーバーの実行中にのみ発生するようです。