私はシリアルプログラムを試していましたが、select()
を使用する前にread()
を使用していることに気付きました。なぜこれが必要なのか。なぜread()
を直接呼び出して、失敗するかどうかを確認できないのですか?また、ファイル記述子を1ずつ増やして、select()
に既に設定されているファイル記述子を渡している間に渡す必要があるのはなぜですか?
例:
r=select(fd+1, &fds, NULL, NULL, &timeout);
fdsには既にfdの値があります
select()
システムコールは、関心のあるファイル記述子に読み込むデータがあるかどうかを示します。厳密には、ファイル記述子はブロックするかどうか。
シリアルポートに接続されているファイル記述子などのファイル記述子でread()
を実行し、読み取るデータがない場合、読み取るデータがあるまで呼び出しはハングします。 select()
を使用するプログラムは、そのようにブロックされたくないです。
あなたも尋ねる:
既に
select
に設定されているファイル記述子を渡すときに、ファイル記述子を1ずつ増やして渡す必要があるのはなぜですか?
それはおそらくFD_SETのサイズを指定している しかし、おそらくひどくそれをやって。 select()
の最初の引数はnfds
と呼ばれ、POSIXは次のように述べています。
nfds
引数は、テストする記述子の範囲を指定します。最初のnfds
記述子は各セットでチェックされます。つまり、0から記述子セットのnfds-1
までの記述子が検査されます。
そのため、ファイル記述子n
をテストするには、nfds
の値は少なくともn+1
でなければなりません。
also対話型ユーザー入力を読み取りながら実行を継続するプログラム1 マルチスレッドまたはにする必要があります。入力ストリームを注意深く、具体的には条件付きで読み取る必要があります。
Select(2)
を使用して、2番目の設計パターンを実装できます。アプリケーション全体をブロックせずに入力を読み取ることができるかどうかを判断できます。
1.または、予測不能に到着する他の入力。
ファイル記述子をブロックせずにIOの準備ができるまで常に監視する必要がある場合は、select呼び出しを使用します。
通常、IO(read())non-blockingが必要な場合に使用します。: manページ
関連するAPIも読んでください