6

kqueue メカニズムにはEV_RECEIPT、リンクされたマニュアル ページによると、イベント フラグ があります。

...保留中のイベントを排出せずにkqueueを一括変更するのに役立ちます。入力として渡されると、EV_ERROR常に返されるように強制されます。フィルタが正常に追加されると、データ フィールドはゼロになります。

neventsただし、パラメーターに0 を渡しkeventてキューからイベントを描画しないだけで、保留中のイベントを排出せずに kqueue を一括変更するのは簡単だと理解しています。それを念頭に置いて、なぜEV_RECEIPT必要なのですか?

OS X に関する Apple ドキュメントの一部のサンプル コードでは、実際に EV_RECEIPT を使用しています。

kq = kqueue();

EV_SET(&changes, gTargetPID, EVFILT_PROC, EV_ADD | EV_RECEIPT, NOTE_EXIT, 0, NULL);
(void) kevent(kq, &changes, 1, &changes, 1, NULL);

しかし、changes配列は呼び出し後に検査されないため、この場合にkeventなぜ使用されたのかはまったくわかりません。EV_RECEIPT

EV_RECEIPT は実際に必要ですか? 本当に役に立つのはどんな場面?

4

1 に答える 1

4

一括変更を行っていて、そのうちの 1 つがエラーを引き起こした場合、イベントは に置かれ、eventlistEV_ERROR が に設定されflags、システム エラーが に設定されますdata

したがってchangelist、エラーの原因となった要素を特定することができます。

ゼロに設定neventsすると、エラー コードは表示されますが、エラーの原因となったイベントは示されません。

したがって、EV_RECEIPT を使用するとnevents、保留中のイベントを排出することなく、ゼロ以外の値に設定できます。

于 2016-06-09T17:17:18.393 に答える