阻塞IO:
大部分程序使用的都是阻塞IO,在缺省下,套接字建立后为阻塞IO
recv:在缓冲区内接收到数据,内核唤醒该进程,如果没有数据,就一直阻塞
send:在发送缓冲区不足,当有足够的发送缓冲区时,内核唤醒该进程
UDP:没有发送缓冲区,sendto()永远不会阻塞
非阻塞IO:当操作不成功后,会返回错误
获取或设置描述符的属性
int fcntl(int fd, int cmd, long arg);
int cmd: F_GETFL, F_SETFL
int flag = fcntl(int fd, F_GETFL, 0);
flag |= O_NONBLOCK;非阻塞方式
fcntl(int fd, F_SETFL, flag);
多路复用IO:
FD_ZERO(&rdfs);
FD_SET(place, &rdfs);
int FD_ISSET(int fd, fd_set *fdest);
FD_CLR(place, &rdfs);
place:要置位的位置,为描述符
select(int n, fd_set *read_fds, fd_set *write_rdfs, fd_set *except, struct timeval *timeout)
返回就绪的个数:将没有就绪的位置置0
n:最大描述符+1
read_fds:读
write_fds:写
except:读写
*timeout:超时时间
先构造一个有关于描述符的表,然后调用select(),当这些描述符中的一个或者
多少个准备好进行IO时函数才返回
阅读(1467) | 评论(0) | 转发(0) |