0

シリアル ポートを使用する OS X アプリを作成しようとしています。例 (ココア) を見つけて、Xcode 4 で実行しました。最初の実行で、ポートが開き、ハードウェアとデータを交換できます。

ポートを変更しようとすると、プログラムが不正になります。風車が起動し、UI が応答しなくなります。Xcode からプログラムを停止することも、ターミナルから強制終了することも強制終了することもできません。Xcodeの強制終了はそれを行いません。PID はターミナルからのキルで消えますが、UI は陽気に回転する風車とともにまだ存在しています。

唯一の解決策は再起動です。誤ったコードを追跡する方法についてのアイデアは大歓迎です。私は Cocoa/Objective C を初めて使用するので、単純な用語の方が適切です。

4

1 に答える 1

0

ゾンビになった可能性が高い。ps auxwwステータスに「Z」が表示されて (または同様の) に表示されるはずです。アクティビティモニターにもまだ表示される場合があります。

これは、シリアル ポートなどのハードウェアを使用する場合に比較的一般的です。ゾンビは 2 つの理由のいずれかで発生する可能性があり、この場合は最初の理由が最も可能性が高いです。

  1. プロセスは、何らかの種類のカーネル呼び出しでブロックされています。これは中断できません。
  2. プロセスは終了しましたが、その親はそれを (wait() などを介して) 確認していません。

最初のケースでは、通常、何らかの根本的なバグまたは設計上の欠陥であり、どのコード パスが問題を引き起こしているかを正確に把握し、それを回避する以外に、適切なオプションがない場合があります。

2 番目のケースでは、解決策は一般的に単純です。ゾンビの親プロセスを見つけて、それを強制終了します。必要に応じて、ゾンビを取得するために wait() を呼び出す親プロセスがゾンビを採用するまで繰り返します (他に何もない場合は、launchd がこれを行います)。

于 2012-12-12T02:54:49.390 に答える