I/O 多重化 (選択)

I.はじめに

        IO multiplexing technology means that the process notify the kernel to monitor one or more specified IO events. When a IO event occured, the kernel notify the wake-up process. 一般に、プロセスが複数の IO を監視および処理する必要があるシナリオで使用されます。マルチプロセスやマルチスレッド方式と比較して、IO多重化技術を使用すると、複数のプロセスやスレッドを作成する必要がなく、システムのオーバーヘッドが削減されます。

        この記事では、複数の IO イベントを監視するようにプロセスがカーネルに通知し、イベントが発生したとき、または設定されたタイムアウト時間に到達したときにプロセスをウェイクアップできるようにする select 関数の使用法を紹介します。
 

2.選択

関数プロトタイプ:

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

パラメータの説明:

nfds: 監視対象のすべてのファイル記述子の中で最大のファイル記述子 + 1

readfds: 読み取り可能なイベントをリッスンするファイル記述子のコレクション

writefds: 書き込み可能なイベントをリッスンするファイル記述子のコレクション

exceptfds: 例外イベントを監視するファイル記述子のコレクション

        readfds、writefds、exceptfds は、それぞれ読み取り、書き込み、および例外イベントのコレクションを表します. fd_set を直接使用して fd コレクション変数を作成し、FD_ZERO を使用してコレクションをクリアし、FD_SET を使用して指定された fd をコレクションに追加し、指定した fd をコレクションから削除するには FD_CLR を使用し、指定した fd がセットに含まれているかどうかを判断するには FD_ISSET を使用します。対応するイベントを気にしない場合は、この関数を呼び出すときに NULL を直接渡すことができます。FD_ZERO、FD_SET、FD_CLR、および FD_ISSET のプロトタイプは次のとおりです。

void FD_ZERO(fd_set *fdset);

void FD_SET(int fd, fd_set *fdset);

void FD_CLR(int fd, fd_set *fdset);

int FD_ISSET(int fd, fd_set *fdset); 

timeout: タイムアウト時間。timeval の構造は次のとおりです。

struct timeval {
    long tv_sec;   // seconds
    long tv_usec;  // microseconds
};

        timeout が NULL に設定されている場合、少なくとも 1 つのイベントが発生するまで待機してから戻ることを意味します。

        timeout が 0 より大きいタイムアウトに設定されている場合、少なくとも 1 つのイベントが発生するのを待ってから戻ることを意味しますが、タイムアウトに達したときにイベントがなくても戻ります。

        timeout が 0 に設定されている場合、タイムアウト (NULL ではない) は、チェックの直後に戻る、つまりポーリングの方法を意味します。

戻り値の説明:

成功した場合、リスナー イベント コレクションで生成されたイベントの数を返します。たとえば、3 つの読み取り可能なイベント、3 つの書き込み可能なイベント、3 つの異常なイベント、1 つの読み取り可能なイベント、1 つの書き込み可能なイベント、2 つの異常なイベントをリッスンし、戻り値は 4 です。

失敗すると、-1 が返され、errno が設定されます。

おすすめ

転載: blog.csdn.net/weixin_38102771/article/details/123179962