展望2011

《unix环境高级编程》通读学习笔记(四)(第12章)

上一篇 / 下一篇  2007-07-28 17:40:27 / 个人分类:unix环境高级编程的学习记录

51Testing软件测试网4s9b-G%w*xif F*L#}

第12章 高级I/O
5z"Vf `|$YyKj2k0

)i;~"bBC^051Testing软件测试网3^5KN*]!P*a

12.1 引言
eN_,ILS012.2 非阻塞I/O
51Testing软件测试网 ^%Y,g3s2F_u#j
低速系统调用是可能会使进程永远阻塞的一类系统调用.
Kr3soHF@"n0非阻塞I/O使我们可以调用不会永远阻塞的I/O操作,例如open,read和write。如果这种操作不能完成,则立即出错返回,表示该操作如继续执行将继续阻塞下去。

-~^BX/FW)?0

ts`9PP4X1Y7k8O012.3 记录锁51Testing软件测试网&bA$r^ Q
记录锁(record locking)的功能是:一个进程正在读或修改文件的某个部分时,可以阻止其他进程修改同一文件区。51Testing软件测试网6V)s~w+e-I3Zp
12.3.1 历史51Testing软件测试网5c+P!R6L?!tS/z
12.3.2 fcntl记录锁51Testing软件测试网.A$KP%d%RSy/F
fcntl函数的原型
w)vBtcy-~0---------------------------------------------------------------------
r LbQ'~#Bbh;}0#include <sys/types.h>
V(IKKU](Q^ ?0#include <unistd.h>51Testing软件测试网"~#u$cH;wP,OL P
#include <fcnt1.h>51Testing软件测试网9~{l7^3@ Y)@
int fcnt1(int filedes,int cmd,.../* struct flock *flockptr */);
8]?e5L7eXT1j%a0返回:若成功则依赖于c m d(见下),若出错则为- 151Testing软件测试网/y@_P:?0s"^_
---------------------------------------------------------------------
G/]7E%F+s*g012.3.3 锁的隐含继承和释放51Testing软件测试网V)FE g.s
关于记录锁的自动继承和释放有三条规则:51Testing软件测试网1cJww4MZbS
(1) 锁与进程、文件两方面有关。
iZb c_+I?0(2) 由fork产生的子程序不继承父进程所设置的锁。51Testing软件测试网KWhZ:t
(3) 在执行exec后,新程序可以继承原执行程序的锁。51Testing软件测试网 t*s,baT"u6w K
12.3.4 4.3+BSD的实现51Testing软件测试网&?`9c^V8h
12.3.5 建议性锁和强制性锁51Testing软件测试网 AZ&E:c;Ke&HH ?0?
考虑数据库存取例程序。如果该库中所有函数都以一致的方法处理记录锁,则称使用这些函数存取数据库的任何进程集为合作进程(cooperating process)。如果这些函数是唯一的用来存取数据库的函数,那么它们使用建议性锁是可行的。51Testing软件测试网O\;`*Fg+N
强制性锁机制中,内核对每一个open、read和write都要检查调用进程对正在存取的文件是否违背了某一把锁的作用。

a&?M[4s`;Xv051Testing软件测试网LRE6I,B

12.4 流
;qU'^iR"Ck y$t0流是系统V提供的构造内核设备驱动程序和网络协议包的一种通用方法。51Testing软件测试网 U0X1Q6O/Dc"n
流在用户进程和设备驱动程序之间提供了一条全双工通路。流无需和实际硬件设备直接对话—流也可以用作为伪设备驱动程序。图12-5示出了一个简单流的基本结构。
7YwHHF9f0图12-6示出了一个包含一个处理模块的流。51Testing软件测试网M2Q sj8Rf
12.4.1 流消息51Testing软件测试网R)F1I/x+i0f
流的所有输入和输出都基于消息。流首和用户进程使用read、write、getmsg、getpmsg、putmsg和putpmsg交换消息。在流首、各处理模块和设备驱动程序之间,消息可以顺流而下,也可以逆流而上。
dgceV1_(BMBJ7w0有约2 5种不同类型的消息,但是只有少数几种用于用户进程和流首之间。其余的则只在内核中顺流、逆流传送。
7TM @K,BH012.4.2 putmsg和 putpmsg函数
)B4X;Z&j0p0putmsg和putpmsg函数用于将流消息(控制信息或数据,或两者)写至流中。
EC-a,B-cE f012.4.3 流ioct1操作
-p/Mm`:oMM0ioctl函数,它能做其他I / O函数不能处理的事情。流系统中继续采用了该函数。51Testing软件测试网}2u1x7f\C9F+_9?
12.4.4 write至流设备
8HI;y:\|ziF012.4.5 写方式
p+xk7Fs"QVA012.4.6 getmsg和 getpmsg函数51Testing软件测试网x|,Q ^,bs
12.4.7 读方式

PY3\&uDy051Testing软件测试网:y_v`VNi%[

12.5 I/O多路转接
!QCk,W O8H9Q0当从一个描述符读,然后又写到另一个描述符时。如果必须读两个描述符又将如何呢?如果仍旧使用阻塞I / O,那么就可能长时间阻塞在一个描述符上,而另一个描述符虽有很多数据却不能得到及时处理。所以为了处理这种情况显然需要另一种不同的技术51Testing软件测试网s'b8sya f@J0f` I
一种比较好的技术是使用I/O多路转接(I/O multiplexing)。其基本思想是:先构造一张有关描述符的表,然后调用一个函数,它要到这些描述符中的一个已准备好进行I/O时才返回。在返回时,它告诉进程哪一个描述符已准备好可以进行I/O。51Testing软件测试网9aUG0r4OsKp5l:jj
12.5.1 select函数51Testing软件测试网5e|)Zv @n;l
select函数使我们在SVR4和4.3+BSD之下可以执行I/O多路转接。51Testing软件测试网C3NpDn5[6a6Y
12.5.2 poll函数51Testing软件测试网/s)U&S p M!@e M!B
SVR4的poll函数类似于select,但是其调用形式则有所不同。我们将会看到,poll与流系统紧紧相关。
1I*O z1}%o0

`N-BhDV%bpjz S0

Y"^T5F;He012.6 异步I/O51Testing软件测试网:tX]U8[~$M
使用select和poll可以实现异步I/O。关于描述符的状态,系统并不主动告诉我们任何信息,我们需要主动地进行查询(调用select或poll)。SVR4和4.3+BSD提供了使用一个信号(在SVR4中是SIGPOLL,在4.3+BSD中是SIGIO)的异步I/O方法,该信号通知进程,对某个描述符所关心的某个事件已经发生。
vKt3}*j j)U4IVC012.6.1 SVR451Testing软件测试网m$C/z N_#t+P&u:B-P1m p@
12.6.2 4.3+BSD51Testing软件测试网*W-_Y)Jw`T
51Testing软件测试网+]9R @:M)[%d'L

W4Ng"St/HZ+p\.L012.7 readv和writev函数
(a'e&_%\ ?,f.~$S0readv和writev函数用于在一个函数调用中读、写多个非连续缓存。
a:CmKZ]m0--------------------------------------------------------------------
%GyZ&o"L7o_9U0#include <sys/types.h>51Testing软件测试网 l3LJ_-w%m6~
#include <sys/uio.h>
6Y!j/ck*`fo0#include <sys/types.h>
i|"fV0p0#include <sys/uio.h>51Testing软件测试网5[;GYHE{;k2c
ssize_t readv(int filedes,const struct ioveciov[ ],int iovcnt);51Testing软件测试网+} E}T H\,x&xM y
ssize_t writev(int filedes,const struct ioveciov[ ],int iovcnt);51Testing软件测试网ua3X` s%w*{^kx
两个函数返回:已读、写的字节数,若出错则为-1
ot+w}1V7K8u0--------------------------------------------------------------------51Testing软件测试网8bfr$@0zQ

^*\ Z:H/T012.8 readn和 writen函数
I'QN oe+aB"Z-L012.9 存储映射I/O

~![~m\__ B0存储映射I/O使一个磁盘文件与存储空间中的一个缓存相映射。于是当从缓存中取数据,就相当于读文件中的相应字节。与其类似,将数据存入缓存,则相应字节就自动地写入文件。这样,就可以在不使用read和write的情况下执行I/O。为了使用这种功能,应首先告诉内核将一个给定的文件映射到一个存储区域中。这是由mmap函数实现的。51Testing软件测试网 G:q*Ay3YIo N"cc
------------------------------------------------------------------------------------
I bXJ:Z3jK0#include <sys/types.h>
.v&vHY9UCl,p'x0#include <sys/mman.h>51Testing软件测试网A6g$k7{5w$Y I?
caddr_t mmap(caddr_t addr, size_tlen,int prot,int flag,int filedes,off_t off);51Testing软件测试网M*@0p7|}m q5[
返回:若成功则为映射区的起始地址,若出错则为 - 1
|}P7oF.Qc.C0------------------------------------------------------------------------------------51Testing软件测试网6q[+Mf;S(v*T2`7p

51Testing软件测试网@'h1HR?3I'a

 51Testing软件测试网w/\pu"Hy


TAG:

 

评分:0

我来说两句

Open Toolbar