下午看文章发现以前理解一个误区

select 是否需要设置fd为非阻塞的?为什么?设置或者不设置对于开发过程有什么不同?

1. select其实对fd到底是否阻塞并不关心,它只关心fd是否可读、可写

2.select其实类似epoll的LT触发。

3.select在非阻塞状态下 如果fd可读后,调用read(fd, buf, 100),如果可读数据小于100,则返回读取的值,如果可读大于等于100,则返回100,这个时候你可以继续读取,直到EAGAIN。也可以等待下次select返回fd可读。

4.select在阻塞状态下 如果fd可读后,调用read(fd, buf, 100),如果可读数据小于100,则返回读取的值,如果可读大于等于100,则返回100,这个时候你不可以继续读取了,因为有可能可读的刚好100,再读就会阻塞住了。 必须等待下次select了。所以阻塞的read在select下不能多次尝试。

5.select在非阻塞状态下 如果fd可写后,调用write(fd, buf, 100),如果可写空间小于100,则返回实际写入的值,如果可写空间大于等于100,则返回100,这个时候你可以继续写,直到EAGAIN。

6.select在阻塞状态下 如果fd可写后,调用write(fd, buf, 100),如果可写空间小于100,阻塞,如果可写空间大于等于100,则返回100,这个时候你不可以继续写,必须等待下次select。

 

另外epoll可以为不同fd设置不同的trigger方式

 

http://bbs.chinaunix.net/thread-908141-1-1.html

http://www.cnblogs.com/promise6522/archive/2012/03/03/2377935.html

posted on 2012-05-04 20:59  brucexu  阅读(257)  评论(0编辑  收藏  举报