网络编程

系统与网络编程-(项目前准备)

2016-12-13  本文已影响74人  I踏雪寻梅

系统与网络编程

select函数

  • 函数声明: int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
  • numfd:一个整形变量的比(readfds,writefds,exceptfds)中的文件描述符的最大值大1.所以必须计算文件描述符最大值以传入。
  • readfds:这个文件描述符集合用来见识文件描述符集里每个文件是否有文件可读,当select返回时,将清空不可读内容。
  • writefds:这个文件描述符集合用来见识文件描述符集里每个文件是否有文件可写,当select返回时,将清空不可写内容。
    -exceptfds:这个文件描述符集合监视文件描述符集中的每个文件是否发生错误
//将一个文件描述符清零
void FD_CLR(int fd, fd_set *set);
//将文件描述符fd加入到集合set中
int  FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
#include <sys/time.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/select.h>
void setMaxFd(int *pMaxFd,int fd)
{
    if(*pMaxFd<fd)
    {
        *pMaxFd=fd;
    }
}
int main()
{
    int iMaxFd=0;
    fd_set readSet;
    int ret=0;
    #if 0
    FD_ZERO(&readSet);//清空
    FD_SET(STDIN_FILENO,&readSet);//将SRDIN_FILENO写入集合readSet中
    //判断文件描述符集合中是否包含了某个文件描述符
    //若包含了返回1,不包含返回0
    int ret=FD_ISSET(TDIN_FILENO,&readSet);
    printf("ret=%d\n",ret);
    #endif
//  ret=FD_ISSET(STDOUT_FILENO,&readSet);
//  printf("ret=%d\n",ret);
    char caBuf[32]={'\0'};
    while(1)
    {   //select()将会阻塞,直到指定的文件描述符集合中有文件符合相应的I/O操作
        FD_ZERO(&readSet);
        FD_SET(STDIN_FILENO,&readSet);//将SRDIN_FILENO写入集合readSet中
        setMaxFd(&iMaxFd,STDIN_FILENO);
        ret=select(iMaxFd+1,&readSet,NULL,NULL,NULL);
        if(ret==-1)
        {
            perror("select");
            return -1;
        }
        //若函数成功返回,那么文件描述符集合中只会包含将要进行IO操作的文件描述符
        //其他没有要进行I/O操作的文件描述符会被清空.
        //如果需要重新监控,需要将清除掉的问津描述符重新添加到集合中.
        //推荐做法:将集合清空,将所有需要监控的文件描述符都添加一遍
        if(FD_ISSET((STDIN_FILENO),&readSet))
        {
            memset(caBuf,'\0',sizeof(caBuf));
            read(STDIN_FILENO,caBuf,sizeof(caBuf));
            printf("%s\n",caBuf);
        }
    }
    printf("Hello World\n");
    return 0;
}
Paste_Image.png Paste_Image.png
上一篇下一篇

猜你喜欢

热点阅读