linuxプログラム設計SELECTシステム呼び出し


最近linuxのネットのプログラミングの中のソケットを学んだばかりで、それから简単なクライアントとサーバーの间で互いに読み書きする简単なプログラムをも书いて、ずっとポーリングの方式で読み書きを行って、そのようにクライアントとサーバーはずっとCPUの资源を占有していると感じて、とてもCPUの资源を浪费して、以前は同じ机械で学校に通ったことがあって信号量でいくつかのプロセスあるいはいくつかのスレッドの间の読み書きと待つことを制御して、しかし今2台の机械の间の通信で、前の信号量は使えなくて、本をめくって、SELECTのこの関数を探し当てて、问题を解决することができます.
selectという関数は読み書きのブロック時間を設定することができます(もちろん永久ブロックに設定することもできます)
以下に簡単なコードを示します.
#include <unistd.h>

int main()
{
        int nread;
        char buffer[128];
        fd_set inputs;

        FD_ZERO(&inputs);
        FD_SET(0,&inputs);


        select(FD_SETSIZE, &inputs, NULL, NULL, NULL);
        printf("aaaaaa
"); nread = read(0,buffer,sizeof(buffer)); buffer[nread] = '\0'; printf("%s",buffer); } ~ ~

実行後、何も入力しないとSELECTの行がブロックされ、データプログラムが入力されるまで実行されません.
もちろん渋滞時間も設定できます
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
        int nread;
        char buffer[128];
        fd_set inputs;
        struct timeval timeout;

        FD_ZERO(&inputs);
        FD_SET(0,&inputs);


        timeout.tv_sec = 2;//2 
        timeout.tv_usec = 500000;//0.5 
        /*    2.5 */


        select(FD_SETSIZE, &inputs, NULL, NULL, &timeout);
        printf("aaaaaa
"); nread = read(0,buffer,sizeof(buffer)); buffer[nread] = '\0'; printf("%s",buffer); }

これで2.5秒ブロックして実行します!