40

私はシリアルプログラムを実行していましたが、使用するselect()前にそれらが使用されていることを確認しましread()た。なぜこれが必要なのですか。直接電話read()して失敗するかどうかを確認できないのはなぜですか?また、ファイル記述子を1ずつインクリメントして、すでにに設定されているファイル記述子を渡すときに渡す必要があるのはなぜselect()ですか?

例:

r=select(fd+1, &fds, NULL, NULL, &timeout); ここで、fdsはすでにfdの値を持っています

4

3 に答える 3

45

システムコールは、select()関心のあるファイル記述子で読み取るデータがあるかどうかを通知します。厳密には、ファイル記述子での読み取り操作がブロックされるかどうかが問題になります。

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

あなたも尋ねます:

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

それはおそらくFD_SETのサイズを指定しています。の最初の引数select()はとして知られてnfdsおり、POSIXは次のように述べています。

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

したがって、ファイル記述子をテストするnには、の値がnfds少なくともである必要がありますn+1

于 2013-01-27T05:13:26.253 に答える
8

インタラクティブなユーザー入力1読み取りながら実行を継続したいプログラムは、マルチスレッド化する、入力ストリームを注意深く、具体的には条件付きで読み取る必要があります。

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


1.または、予期せずに到着するその他の入力。

于 2013-01-27T05:28:13.787 に答える
3

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

IO(例:read())を非ブロッキングにする場合に一般的に使用されます。:manページを読んでください。

関連するAPIもお読みください

于 2013-01-27T05:13:55.010 に答える