统Ⅴ之前,whence被指定为0(绝对位移量),1(相对于当前位置的位移量)或2(相对
文档尾端
的位移量)。很多软件仍直接使用这些数字进行编码。
在lseek中的字符l表示长整型。在引入off[CD#*2]t数据类型之前,offset参数和
返回值是
长整型的。lseek是由Version 7引进的,当时C语言中增加了长整型。(在Version
6中,用
函数seek和tell提供类似功能。)
实例
程式31测试其标准输入能否被配置位移量。
程式31〓测试标准输入能否被配置位移量。
假如我们用交互方式调用此程式,则可得:
$ aout < /etc/motd
seek OK
$ cat < /etc/motd |aout
cannot seek
$ aout < /var/spool/cron/FIFO
cannot seek
通常,一个文档的当前位移量应当是个非负整数,但是,某些设备也可能允许负
的位移量
。但对于普通文档,则其位移量必须是非负值。因为位移量可能是负值,所以在比
较lseek
的返回值时应谨慎,不要测试他是否小于0,而要测试他是否等于-1。
在80386上运行的SVR4支持/dev/kmem设备能够具备负的位移量。
因为位移量是带符号数据类型(off[CD#*2]t)(见图28),所以最大文档长度减少
一半。例
如,若off[CD#*2]t是32位整型,则最大文档长度是231字节。
lseek仅将当前的文档位移量记录在系统核内,他并不引起任何I/O操作。然后,该
位移量用
于下一个读或写操作。
文档位移量能够大于文档的当前长度,在这种情况下,对该文档的下一次写将延长
该文档,
并在文档中构成一个空调,这一点是允许的。位于文档中但没有写过的字节都被读
为0。
实例
程式32创建一个具备空洞的文档
程式32创建一个具备空洞的文档
运行该程式得到:
$ aout
$ ls -1 filehole 〓〓〓〓〓〓〖WB〗检查其大小
-rw-r--r--〓1 stevens〓50 Jul 31 05:50 filehole
$ od -c filehole〖DW〗观察实际内容
000000〓〖WB〗a〓b〓c〓d〓e〓f〓g〓h〓i〓j \0〓\0〓\0〓\0〓\0
〓\0
000020〖DW 剑埽啊埽啊埽啊埽啊埽啊埽啊埽啊埽啊埽啊埽啊?nbsp;
0〓\
0〓\0〓\0〓\0〓\0
000040〖DW 剑埽啊埽啊埽啊埽啊埽啊埽啊埽啊埽啊痢隆谩?nbsp;
D〓E〓
F〓G〓H
000060〖DW〗I〓J
000062
我们使用od(1)命令观察该文档的实际内容。命令行中的-C标志表示以字节方式打
印文档内
容。从中能够看到,文档中间的30个未写字节都被读成为0。每一行开始的一个七
位数是以
八进制形式表示的字节位移量。在本例中,我们调用了将在38节中说明的write
函数。在4
12节中我们将对具备空洞的文档进行更多说明。
37〓read函数
用read函数从打开文档中读数据。
#include <unistdh>
ssize[CD#*2]t read(int filedes,void *buff,size[CD#*2]t nbytes
);
返回:读到的字节数,若已到文档尾为0,出错为-1
如read成功则返回读到的字节数。假如已到达文档的尾端,则返回0。
有多种情况可使实际读到的字节数少于需要读字节数:
读普通文档时,在读到需要字节数之前已到达了文档尾端。例如,若在到达文档尾
端之前还
有30个字节,而我们却需要读100个字节,则read返回30,下一次我们再调用read
时,他将
返回0(文档尾端)。
·当从终端设备读时,通常一次最多读一行(在第十一章中将介绍如何改变这一点
)。
·当从网络读时,网络中的缓冲机构可能造成返回值小于所需要读的字节数。
·某些面向记录的设备,例如磁带,一次最多返回一个记录。
读操鞔游牡档牡鼻拔灰屏看迹诔晒Ψ祷刂埃梦灰屏吭黾邮导识恋玫淖?nbsp;
节数。
POSIX1在几个方面对此函数的原型作了更改。其经典定义是:
int read(int fildes,char *buff,unsigned nbytes);
首先,为了和ANSI C一致,其第2个参数由char *改为void *。在ANSI C中,类型
void *用
于表示类属指针。其次,其返回值必须是个带符号整数(ssize[CD#*2]t),以返
回正字节
数、0(表示文档尾端)或-1(出错)。最后,第3个参数在历史上是个不带符号整数,
以允许一
个16位的实现能够一次读或写至65534个字节。在1990 POSIX1标准中,引进了新
的基本系
统数据类型ssize[CD#*2]t以提供带符号的返回值,size[CD#*2]t则被用于第3个参
数(回忆
图27中的SSIZE〖CD#*2]MAX常数。)
38〓write函数
用write函数向打开文档写数据。
#include <unistdh>
ssize[CD#*2]t write(int filedes,const void *buff,size[CD#*2]t
nbytes
);
返回:若成功为已写的字节数,出错为-1
其返回值通常导于参数nbyte,否则表示出错。write出错的一个常见原因是:或
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




