も実行し続けたいプログラム インタラクティブなユーザー入力の読み取りは、マルチスレッド化する必要がありますまたは 入力ストリームを注意深く、具体的には条件付きで読み取る必要があります。
Select(2)
2 番目の設計パターンの実装に使用できます。アプリケーション全体をブロックすることなく、入力を読み取ることができるかどうかを判断できます。
select()
システム コールは、関心のあるファイル ディスクリプタで読み取るデータがあるかどうかを示します。厳密には、ファイル ディスクリプタでの読み取り操作がブロックされるかどうかの問題です。
read()
を実行すると シリアル ポートに接続されているようなファイル ディスクリプタで、読み取るデータがない場合、読み取るデータが存在するまで呼び出しはハングします。 select()
を使用したプログラム そのようにブロックされたくありません.
あなたも尋ねます:
<ブロック引用>
すでに select
に設定されているファイル記述子を渡すときに、ファイル記述子を 1 ずつインクリメントして渡す必要があるのはなぜですか。 ?
それはおそらくFD_SETのサイズを指定しています。 select()
の最初の引数 nfds
として知られています そしてPOSIXは言う:
nfds
引数は、テストする記述子の範囲を指定します。最初の nfds
記述子は各セットでチェックされます。つまり、0 から nfds-1
までの記述子 記述子セットで検査されるものとします。
したがって、ファイル記述子 n
をテストするには 、nfds
の値 n+1
以上である必要があります .
ブロックせずに何らかの IO の準備が整うまで、ファイル記述子を常に監視する必要がある場合は、select 呼び出しを使用します。
通常、IO (例:read() ) ノンブロッキングが必要な場合に使用されます。:man ページを参照してください
関連する API もお読みください