select関数分析

2279 ワード

一、I/O多重化の概要
I/O多重は、典型的には以下のネットワークアプリケーションの場合に使用される. 
−複数のディスクリプタ(通常はインタラクティブ入力とネットワークソケット)を処理する場合、I/O多重を使用しなければならない.
-複数のソケットを同時に処理することが可能ですが、珍しいです.
-TCPサーバの場合は、待ち受けソケットを処理したり、接続済みソケットを処理したりするために、I/O多重を使用するのが一般的です.
-サーバがTCPを処理したり、UDPを処理したりする場合、I/O多重を使用するのが一般的です. 
-1つのサーバが複数のサービスまたは複数のプロトコルを処理する場合は、I/O多重化が一般的です.
I/O多重化は、ネットワークプログラミングに限定されず、多くの重要なアプリケーションもこの技術を使用する必要がある.
二、select関数
関数により、プロセスは、カーネルが複数のイベントのいずれかの発生を待っていることを示し、1つ以上のイベントが発生したり、指定された時間が経過した後にのみ呼び覚まします.
一例として、私たちはselectを呼び出すことができます.カーネルは次のような状況で発生した時だけ戻ります. 
-集合{1,4,5}のいずれかの記述子は読みやすいように準備されています. 
-集合{2,7}の中の任意の記述子は、書き込みの準備ができています. 
-セット{1,4}のいずれかの記述子には異常条件があります. 
-10.2秒を経験しました.
つまり、私たちはselectを呼び出して、カーネルにどのようなディスクリプタ(勉強、書く、または異常な条件)に興味を持ち、どれぐらいの時間を待つかを教えます.興味のあるディスクリプタはソケットに限らず、どのディスクリプタもselectを使ってテストできます.
 	/* According to POSIX.1-2001 */
       #include 
       /* According to earlier standards*/
       #include 
       #include 
       #include 

       int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
						  :            ,     0,     -1
       void FD_CLR(int fd, fd_set *set);
       int  FD_ISSET(int fd, fd_set *set);
       void FD_SET(int fd, fd_set *set);
       void FD_ZERO(fd_set *set);
関数の最後のパラメータtimeoutから紹介します.指定されたディスクリプタの中の任意の準備時間がどれぐらいかかりますか?timeval構造はこの時間の秒数と微妙な数を指定するために使われます.
	struct timeval {
               long    tv_sec;         /* seconds */
               long    tv_usec;        /* microseconds */
           };
この3つのパラメータは以下の3つの可能性があります.
  • はいつまでも待っています.一秒の数字があれば、I/Oを用意してから戻ります.このため、このパラメータを空のポインタ
  • に設定します.
  • は、固定時間を待つ.I/Oを準備した記述子が戻ってくるが、このパラメータによって指し示すtimeval構造で指定された秒数と微妙数を超えない.
  • は待っていません.ディスクリプタを確認したらすぐに戻ります.これをポーリングといいます.このため、このパラメータは1つのtimeval構造を指す必要があり、その中のタイミング値(この構造で指定された秒数と微妙な数)は0である必要がある.
  • 前の2つの場合の待ち時間は、通常、待ち時間中に取り込まれた信号によって中断され、信号処理関数から返される.