selectシステム呼び出し


#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>

int main()
{
    char buffer[128];
    int result,nread;
    fd_set inputs,testfds;
    struct timeval timeout;
    
    FD_ZERO(&inputs);
    FD_SET(0,&inputs);

    while(1)
    {
        testfds = inputs;
        timeout.tv_sec = 2;
        timeout.tv_usec = 500000;

        result = select(FD_SETSIZE,&testfds,(fd_set *)NULL,(fd_set *)NULL,&timeout);

        switch(result)
        {
            case 0:
                 printf("timeout
"); break; case -1: perror("select"); exit(1); default: if(FD_ISSET(0,&testfds)) { ioctl(0,FIONREAD,&nread); if(nread == 0) { printf("keyboard done
"); exit(0); } nread = read(0,buffer,nread); buffer[nread] = 0; printf("read %d from keyboard: %s",nread,buffer); } break; } } }

 
void FD_ZERO(fd_set *fdset); void FD_CLR(int fd,fd_set *fdset); void FD_SET(int fd,fd_set *fdset); int FD_ISSET(int fd,fd_set *fdset);
FD_ZEROはfd_setは空の集合FD_に初期化されるSETとFD_CLRは、パラメータfdによって伝達されるファイル記述子をセット内で設定およびクリアするためにそれぞれ使用される.FD_ISSETがパラメータfdによって指し示すファイル記述子は、パラメータfdsetによって指し示すfd_であるsetコレクションの要素、FD_ISSETは0以外の値を返します.FD_ISSETは、ファイルハンドルが設定されているかどうかを確認します.
select呼び出しは、ファイル記述子のセット内で、読み取り可能または書き込み可能またはエラーの状態にあるファイル記述子があるかどうかをテストするために使用され、ファイル記述子が上記の状態に入るのを待つためにブロックされます.
select呼び出しは、ステータスが変化した記述子の総数を返します.失敗すると、-1が返され、エラーを記述するためにerrornoが設定されます.
パラメータnfdsは、試験ファイルの記述子数を指定する、試験の記述子範囲は0からnfds-1までである.
使用法:int ioctl(int handle,int cmd,[int*argdx,int argcx]);
機能:I/O機器を制御し、機器情報を取得し、機器に制御パラメータを送信する手段を提供する.デバイスに制御および構成コマンドを送信するには、read/writeで読み書きできないOut-of-bandデータと呼ばれるパラメータを制御する必要があるコマンドがあります.すなわち、read/write読み書きデータはin-bandデータであり、I/O操作の主体であり、ioctlコマンドは制御情報を伝送し、その中のデータは補助データである.
FIONREAD:受信キャッシュ領域のバイト数を取得してこのプログラムを実行すると、2.5秒おきにtimeoutが印刷されます.キーボードで人の文字を叩くと.標準入力からデータを読み取り、人をたたく内容を報告します.
./select
timeout
hello
read 6 from keyboard:hello
fred
read 5 from keyboard:fred
timeout
CTRL+D
keyboard done