web-dev-qa-db-ja.com

Linuxでselectが使用される理由

私はシリアルプログラムを試していましたが、select()を使用する前にread()を使用していることに気付きました。なぜこれが必要なのか。なぜread()を直接呼び出して、失敗するかどうかを確認できないのですか?また、ファイル記述子を1ずつ増やして、select()に既に設定されているファイル記述子を渡している間に渡す必要があるのはなぜですか?

例:

r=select(fd+1, &fds, NULL, NULL, &timeout); fdsには既にfdの値があります

36
user1667307

select() システムコールは、関心のあるファイル記述子に読み込むデータがあるかどうかを示します。厳密には、ファイル記述子はブロックするかどうか。

シリアルポートに接続されているファイル記述子などのファイル記述子でread()を実行し、読み取るデータがない場合、読み取るデータがあるまで呼び出しはハングします。 select()を使用するプログラムは、そのようにブロックされたくないです。

あなたも尋ねる:

既にselectに設定されているファイル記述子を渡すときに、ファイル記述子を1ずつ増やして渡す必要があるのはなぜですか?

それはおそらくFD_SETのサイズを指定している しかし、おそらくひどくそれをやってselect()の最初の引数はnfdsと呼ばれ、POSIXは次のように述べています。

nfds引数は、テストする記述子の範囲を指定します。最初のnfds記述子は各セットでチェックされます。つまり、0から記述子セットのnfds-1までの記述子が検査されます。

そのため、ファイル記述子nをテストするには、nfdsの値は少なくともn+1でなければなりません。

41

also対話型ユーザー入力を読み取りながら実行を継続するプログラム1 マルチスレッドまたはにする必要があります。入力ストリームを注意深く、具体的には条件付きで読み取る必要があります。

Select(2) を使用して、2番目の設計パターンを実装できます。アプリケーション全体をブロックせずに入力を読み取ることができるかどうかを判断できます。


1.または、予測不能に到着する他の入力。

7
DigitalRoss

ファイル記述子をブロックせずにIOの準備ができるまで常に監視する必要がある場合は、select呼び出しを使用します。

通常、IO(read())non-blockingが必要な場合に使用します。: manページ

関連するAPIも読んでください

3