select

来源:互联网 发布:手机word朗读软件 编辑:程序博客网 时间:2024/06/04 22:46

1. select

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

readfds:select监视的可读文件句柄集合
writefds:select监视的可写文件句柄集合
exceptfds:select监视的异常文件句柄集合
timeout:本次select()的超时结束时间 (见/usr/sys/select.h)
当readfds或writefds中映象的文件可读或可写或超时,本次select() 就结束返回

2. FD_CLR

void FD_CLR(int fd, fd_set *set);

从集合set中删除描述字fd

3. FD_ISSET
int FD_ISSET(int fd, fd_set *set);
测试fd是否是集合set中一员

4. FD_SET

void FD_SET(int fd, fd_set *set);

向集合set添加描述字fd

5. FD_ZERO

void FD_ZERO(fd_set *set);

将set初始化为空集NULL

6. 举例

struct client{    int num;    int afd[10];    fd_set set;    pthread_mutex_t mutex;};static struct client client;void *func(void *p)  {      int i = 0;    int ret = 0;    char buf[100] = {0};     while(1)      {        FD_ZERO(&client.set);        pthread_mutex_lock(&client.mutex);        for(i = 0; i < client.num; i++)        {            FD_SET(client.afd[i], &client.set);        }        pthread_mutex_unlock(&client.mutex);        ret = select(client.afd[--i] + 1, &client.set, NULL, NULL, NULL); //查询满足要求的套接字        if(ret == 0xffffffff)        {              perror("select 0xffffffff.");        }          else if(ret == 0)          {              perror("select 0.");          }          else if(ret > 0)          {              for(i = 0; i < client.num; i++)            {                memset(buf, 0, sizeof(buf));                if(FD_ISSET(client.afd[i], &client.set))                {                    ret = recv(client.afd[i], buf, sizeof(buf), 0);                    if(ret > 0)                    {                        puts(buf);                    }                }              }        }     }  }  int main()  {      int ret = 0;      int fd = 0;      fd = socket(PF_INET, SOCK_STREAM, 0);      struct sockaddr_in my_addr;      my_addr.sin_family = AF_INET;      my_addr.sin_port = htons(5000);      my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");      ret = bind(fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));      ret = listen(fd, 10);      pthread_mutex_init(&client.mutex, NULL);    int len = 0;    pthread_t pid = 0;      struct sockaddr_in his_addr;    while(1)      {          memset(&his_addr, 0 ,sizeof(struct sockaddr_in));          int afd = accept(fd, (struct sockaddr*)&his_addr, &len);          pthread_mutex_lock(&client.mutex);        client.afd[client.num++] = afd;        pthread_mutex_unlock(&client.mutex);        if(pid == 0)        {            ret = pthread_create(&pid, NULL, func, NULL);          }     }      pthread_mutex_destroy(&client.mutex);    return 0;  }  
1 0