The documentation of poll() did not explain this in detail. While polling on an fd, when should one POLLIN and when should one use POLLPRI? Any insights will be useful.
3 に答える
poll() ドキュメントにいくつかの説明があります。
POLLIN 読み取るデータがあります。POLLPRI 読み取る緊急のデータがあります。
POLLIN のみを使用する場合、poll() は、読み取るデータまたは緊急のデータがある場合に戻ります。POLLPRI のみを使用する場合、poll() は、読み取る緊急のデータがある場合にのみ返されますが、通常のデータは無視されます。
緊急データとは何ですか?tcp の帯域外データのように。TCP フレーム ヘッダーには、urg_data という名前のフラグがあります。Urg_data は、このフレームの配信優先度が高いことを意味します。カーネルが urg_data で作成されたフレームを受信すると、POLLPRI フラグが設定されます。次のコードを見てください。
...
if (tp->urg_data & TCP_URG_VALID)
mask |= POLLPRI;
....
return mask;
UNIX ネットワーク プログラミングによると、第 3 版POLLPRI
は STREAMS 専用であり、POSIX 準拠のシステムで TCP または UDP を使用している場合はトリガーされません。
私は常に両方を使用します。これはビットマスクであるため可能です(したがって、を使用できますPOLLIN | POLLPRI
)。
優先順位のエントリは、通常の情報よりも重要であると考えられる情報のためのものです。理想的には、両方のタイプを要求してから、最初に優先度の高いタイプをチェック/処理します。