1. ホーム
  2. c

[解決済み] pollとselectの違いは何ですか?

2022-04-20 13:32:09

質問

POSIX規格を参照しています セレクト ポール システムC APIコールを使用します。

解決方法は?

私が思うに これ が質問に答えています。

<ブロッククオート

リチャード・スティーブンス([email protected])より。

基本的な違いは、select()のfd_setがビットマスクであること、そして したがって、ある程度の固定されたサイズを持っています。 カーネルが カーネルがコンパイルされるときにこのサイズを制限しないようにする。 アプリケーションはFD_SETSIZEを好きなように定義することができます。 のシステムヘッダは、今日、それを暗示しています)しかし、それはより多くの仕事を必要とします。 4.4BSDの カーネルもSolarisのライブラリ関数も、この制限を設けています。 しかし、私は BSD/OS 2.1では、この制限を回避するようにコーディングされているようなので、この制限を回避することは可能です。 プログラミングのちょっとした問題ですが、可能です。) 誰かが Solaris のバグレポートで、これが修正されるかどうか見てみましょう。

しかし、poll() では、ユーザは pollfd の配列を割り当てる必要があります。 構造体を作成し、その配列のエントリ数を渡します。 基本的に制限はありません。 Casperが言うように、poll()を持つシステムの方が selectの方が移植性が高いです。 また、オリジナルの 実装(SVR3)では、ディスクリプタに-1をセットして カーネルがpollfd構造体のエントリを無視するようになり、そのため SVR4はこれを回避しています。 個人的には、私はいつも select() を使っていて、 poll() はほとんど使っていません。 をBSD環境にも対応させることができます。 誰かが実装を書くことができる このような環境では、select()を使用するpoll()が有効です。 見たことがない。select()とpoll()はどちらもPOSIX 1003.1g.

2017年10月更新

上記で参照したメールは少なくとも2001年と古いものであり、その poll() コマンドは、現在(2017年)、BSDを含むすべてのモダンなオペレーティングシステムでサポートされています。 実際、一部の人々は select() は非推奨とする . 意見は別として poll() は、最近のシステムではもはや懸念されることはありません。 さらに epoll() はその後開発されました( マニュアルを読む ) があり、現在も人気が高まっている。

現代の開発では、おそらく select() は、明確に間違っているわけではありませんが。 poll() と、より現代的な進化を遂げています。 epoll() と同じ機能 (およびそれ以上) を提供します。 select() その制限を受けることなく