荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: everlove.bbs@bbs.shuoshuo.net (我是如此厌倦), 信区: Linux
标  题: unp第六章学习体会
发信站: 寂寞森林 (Mon Sep 23 10:41:29 2002)
转信站: SZUBBS!news2.happynet.org!news.happynet.org!LonelyWood


发信人: clown (梧桐叶), 信区: UNP
标  题: unp第六章学习体会
发信站: UNIX编程 (2001年08月26日12:35:41 星期天), 站内信件

本章主要介绍了select, pselect, poll三个函数,然后对以前的回设socket进行了改进



1)I/O模型
有五种:
阻塞I/O,非阻塞I/O,I/O复用(select和poll),信号驱动I/O,异步I/O(Linux不支

持)。前面三种相信大家都很熟悉,后面的两种用的比较少,书上也说得很明白,就不再
介绍。

2)select和pselect函数
相信select函数大家比较熟悉了,这里还是说明一下要注意的问题:
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset

,  const struct timeval *timeout);
   ~~~~~~注意,不同的系统该参数不同
首先,maxfdp1是文件描述符的最大值加1,该参数的存在是为了提高系统的效率,知道

了select的实现原理,不难体会到此点。对于打开的标准I/O文件,可以使用函数fielno进
行转化。
其次,正如前一章介绍的,慢系统调用被信号中断的问题,书中又提到了这个问题,不

过我在Linux中使用SIGINT信号作了测试,并没有发现存在该问题。
注:以后若不作特别说明,Linux指Linux Redhat 7.1,核心为2.4.2。
最后,关于timeout参数,不同的系统该参数的返回值不同,估计Unix中该参数是const

型的。而在Linux中,该参数是值-结果参数,函数返回以后,该参数的指示未睡眠的时间


pselect函数是对select函数的改进:
(1)时间精度更高,由微秒改进到纳秒
(2)避免了select函数体内信号被捕获的竞争条件,特别是信号处理函数中涉及到全局变

量,并且在select函数体内使用到该全局变量时,一定要使用pselect,因为pselect函数

许在其函数处理中禁止提交规定的信号。
(3)Linux中,pselect中的timeout参数是const型的,返回后该参数的值不会改变,这一

点与select函数是不一样的。
(3)我看了一下Linux的manual,发现其中有这样的说明:在glibc2中并没有实现pselec

t函数的系统调用,因此与select函数一样,在信号处理时,还是存在竞争条件。

3)poll函数
目前该函数用的比select函数要少得多,主要是改进select函数中最大可用描述符数目

的问题。
select中该值受到FD_SETSIZE和进程可用描述符最大数目的限制,而poll函数就不存在

该限制。实际上我也没有用过poll,因此就没有什么好说的了。


本章对以前的socket程序使用select和poll函数作了实现,由于比较简单,就不再详细

介绍,要说明的一点是,使用select以后,服务器返回的RST在客户端马上就可以处理,而
不是象以前组塞于fgets函数,一直要等到用户send数据时才能处理。


本次的排版存在问题,没一行多了几个字符,由于我得网速比较慢,就不修改了,以后

注意。另外我不小心感冒了,不停地流鼻涕,一卷子记下就用完了,真是痛苦呀。
另外,热烈祝贺中国国脚昨天大胜阿联酋!
--
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.1.61]

--
我站在夜的尽头
窗外的雨悄悄坠落





※ 来源:.寂寞森林 http://bbs.shuoshuo.net  ◆ FROM: 211.161.158.231


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店