读书笔记之UNIX环境高级编程(14)

来源:互联网 发布:工业机器手臂编程 编辑:程序博客网 时间:2024/06/07 04:11
高级I/O
1.对于一个给定的描述符有两种方法对其指定非阻塞I/O
(1)open打开描述符,则可指定O_NOBLOCK标志
(2)对于一个已经打开的描述符,则可调用fcntl,由该函数打开O_NONBLOCK文件状态标志

2.记录锁的功能是:当一个进程正在读或修改文件的某个部分时,它可以阻止其他进程修改同一文件区

3.传向select的参数告诉内核:
(1)我们所关心的描述符
(2)对于每一个描述符我们所关心的状态
(3)愿意等待多长时间
4.select返回时:
(1)已准备好的描述符的数量
(2)对于读写或异常这三个状态的每一个,哪些描述符已准备好
5.select的中间三个参数中的任意一个或全部都可以为空指针,这表示对响应状态不关心
6.select的第一个参数maxfd1的意思是"最大描述符+1",指的是描述符的个数
7.select返回-1表示出错,出错时可能的。
8.select返回0表示没有描述符准备好,若指定的描述符没有准好,而且指定的时间已超过
9.select正返回值,表示已经准备好的描述符数,该值是三个描述符集中已准备好的描述符数,如果同一描述符已准备好读和写,那么在返回值中将其计为2。这种情况下,三个描述符集仍旧打开的位对应于已准备好的描述符

select每次重新调用时都把fd_set置为零,返回时未准备就绪的描述符被置为0
10."准备好"说明:
(1)若对读集中的描述符的read的操作将不会阻塞,则此描述符是准备好的
(2)若对写集中的描述符的write操作将不会阻塞,则此描述符是准备好的
(3)若异常状态集中的描述符有一个未觉异常的状态,则此描述符是准备好的
(4)对于读写异常状态,普通的文件描述符总是返回准备好
11.一个描述符阻塞不影响select阻塞,如果指定一个无限超值,则在该描述符数据准备好或捕捉到一个信号之前,select一直阻塞
12.如果在一个描述符上碰到了文件结尾处,seleect认为该描述符可读。
13.poll函数可用于任何类型的文件描述符,与select不同,poll不是为每个状态构造一个描述符集,而是构造一个pollfd结构数组,每个数组元素指定一个描述符编号以及其所关心的状态
14.应将每个数组的元素的events成员设置值,告诉内核我们对该描述符关心的是什么。返回时,内核设置revents,说明该描述符已经发生了什么事件。poll没有修改events成员,select修改成员以指示哪一个描述符准备好
15.当一个描述符被挂断pollhup后,就再不能写向该描述符,但是仍可能从该描述符读到数据
16.与select,poll不会因为描述符阻塞而自己阻塞
17.如果信号可能中断对select,poll的调用,但都不会重启动
18.异步I/O的一个限制是每个进程只有一个信号。如果要对几个描述符进行异步I/O,那么在进程接收到该信号时并不知道这一信号对应于哪一个描述符
19.一次read操作所返回的数据可能少于所要求的数据,即使还没达到文件尾端也可能是这样,这不是错误,应当继续读
20.一次write操作的返回值可能少于指定输出的字节数。这也不是错误,应当继续写下去
21.若在已经读写了一些数据后出错,则这两个函数返回已传输的数据量,而非出错返回
22.存储映射I/O(mmap)使一个磁盘文件与存储空间的一个缓冲区相映射。于是当从缓冲区中取数据。就相当于读文件中的相应字节。与此类似,将数据存入缓冲区则相应字节自动写入文件,这样就可以不使用readn和writen的情况下执行I/O









0 0
原创粉丝点击