


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Chapter3 文件操作(本章中描述的都为不带缓冲的I/O函数)不带缓冲的I/O:每个read和write都调用内核中的一个系统调用文件描述符:对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数,当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。当读或者写一个文件时,使用open或create返回的文件描述符标识该文件,将其作为参数传给read或write。文件描述符0(标准输入) - STDIN_FILENO 1(标准输出) -STDOUT_FILENO 2(标准错误输出)-STDERR_FILENO函数:(以下函数具体解释请参照UNIX环境高级
2、编程)open : int open(const char *pathname, int oflag, ) pathname是要创建或打开的文件名字 oflag中O_RDONLY O_WRONLY必须指定且只能指定一个 O_RDWRopen函数返回的一定是最小的未用描述符数值create:int create(const char *pathname,mode_t mode);若成功则返回只写打开的文件描述符,出错返回-1等效于:int open(pathname, O_WRONLY|O_CREAT|O_TRUNC,mode) mode 为访问权限的初始值,由几个标志按位或后得到。 S_IRU
3、SR S_IWUSR S_IXUSR S_IRGRP S_IWGRP S_IXGRP S_IROTH S_IWOTH S_IXOTH open、create调用里给出的mode值将与当时的用户掩码的反值做AND操作。close:int close(int filedes) 成功返回0,出错返回-1当一个进程终止时,内核自动关闭它所有打开的文件文件偏移量:用来度量从文件开始处的字节数,通常读写操作从当前文件偏移量开始,并使偏移量增加所读写的字节数。除非指定O_APPEND,否则为0文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞,这是允许的,
4、位于文件中但没有写过的字节都被读为.文件中的空洞并不在磁盘上占用存储区。(相同长度的空洞文件和不含空洞的文件,磁盘块占用数量不同)lseek:显式地为一个打开的文件设置其偏移量 lseek中如果文件描述符引用的是一个管道(|)、FIFO(FIFO)或者网络套接字,则lseek返回-1(所以对lseek返回值进行判断时应该判断!=-1),并将error设置为(ESPIPE) lseek仅将当前文件的偏移量记录在内核中,它并不引起任何操作。 看书上内容read:从打开的文件中读取数据,如read成功,返回读到的字节数,如已经达到文件末尾,则返回0.write改善I/O性能预读:当检测到正进行顺序读
5、取时,系统就试图读入比应用程序锁要求的更多数据,并假想应用程序很快就会读这些数据。(这和缓存不同)文件共享(不同进程间共享打开的文件)内核为所有的进程维护一张进程表,一个进程对应进程表中的一项,进程表中的每一项都维护一张文件描述符表,文件描述符表中记录着该进程中打开的文件信息,包括文件描述符标志和文件指针。内核为所有打开的文件维护一张文件表(一个文件描述符表项对应一个文件表表项,每个进程都有自己的文件表项的一个理由是这种安排使得每个进程都有它自己的对该文件的当前偏移量,所以说一个文件有多个文件表项,因为他在不同进程(不同文件描述符)上被打开; 当然也有可能不同进程对同一个文件维护同一个文件表,
6、比如父子进程),一个文件表表项包括文件状态标志、当前文件偏移量、v节点指针,每个打开文件都有一个v节点结构,包含v节点信息、i节点信息、当前文件长度。一个给定文件只有一个v节点表项。Linux中没有v节点,使用inode节点,它是系统中的一个特殊的数据块,它同时还包含文件的长度和文件在磁盘上的存放位置。系统使用的是文件的inode编号,目录结构和文件命名只是为了便于人们使用。(Linux)文件描述符标志和文件状态标志在作用域方面的区别:前者只用于一个进程的一个描述符,而后者则适用于指向该给定文件表项的任何进程中的所有描述符。原子操作:定位搜索和执行I/O成为原子操作:pread/pwrite
7、允许原子性地定位搜索(seek)和执行I/O调用pread/pwrite时,无法中断其定位和读操作不更新文件指针?测试和创建文件成为原子操作:open函数的O_CREATE 和O_EXCL选项O_CREATE:若此文件不存在,则创建它。使用此选项时,需要O_EXCL,用其指定该新文件的访问权限位,O_EXCL:如果同时指定了O_CREATE,而文件已经存在,则会出错。用此可以测试一个文件是否存在,如果不存在,则创建次文件,这是测试和创建两者成为一个原子操作。dup 和dup2函数(使得close和fcnt1成为原子操作)用来复制一个现存的文件描述符int dup(int filedes):fi
8、ledes为一个现存的文件描述符标志,dup返回一个新文件描述符数值,该数值一定是当前可用文件描述符中的最小数值,这个返回的新文件描述符与参数filedes共享同一个文件表项(即文件指针指向同一个文件表),但是它们的文件描述符标志并不相同。int dup2(int filedes,int filedes2),与dup的区别是dup2可以用filedes2参数指定新描述符的数值,如果filedes2已经打开,则将其先关闭。相当于close(filedes2); fcnt1(filedes,F_DUPFD,filedes2); 但不是原子操作延迟写:UNIX在内核中设有缓冲区高速缓存或页面高速缓存
9、,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区,如果该缓冲区尚未写满,则并不将其排出输出队列,然后待其到达队首时,才进行实际的I/O操作。sync、fsync和fdatasync函数:保持磁盘上实际文件系统与缓冲区告诉缓存中内容的一致性。延迟写降低了磁盘读写的次数,但是降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟写可能造成文件更新内容的丢失。void sync (void):只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘结束操作。称为update的系统守护进程会周期
10、性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区,命令sync(1)也调用sync函数int fdatasync(int filedes):fdatasync函类似于fsync,但它只是影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。int fsync(int filedes):只对有文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束然后返回,fsync可以用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。fcntl函数:改变已打开文件的性质ioctl函数:每个设备驱动程序都可以定义它自己专用的一组ioct1命令。系统为不同类型的设备提供通用的ioct1命令。使用ioct1命令除了要包含所要求的头文件(unistd.h sys/ioct1.h stropts.h)外,还要包含设备专用头文件/dev/fd:可作为路径名参数被open、create调用 主要供shell使用打开文件/dev/fd/n等效于复制描述符nfd=open(“/dev/fd
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社区的护理评估
- 2025年农村修房协议
- 人教部编版三年级语文下册《鹿角和鹿腿》公开课教学课件
- 武则天课件内容
- 工业机器人模拟考试题+答案
- 护理六联观察实施要点
- 肿瘤的免疫诊断
- 班干部大队委员竞选28
- 护理组长老师竞聘
- 眼科护理微课
- 二年级语文下册第一至八单元复习教案
- 捐赠行为中的神经科学研究
- 护理交接班质控总结
- (正式版)QBT 5998-2024 宠物尿垫(裤)
- (正式版)HGT 6276-2024 双酚F型环氧树脂
- 2023年中国(教育部)留学服务中心招聘考试真题及答案
- 2024年木工班组劳务合同模板
- 肝性脑病小讲课
- 小学生安全教育主题班会 预防性侵守护成长 课件
- 学校中考心理辅导活动方案
- 德国民法典中文版
评论
0/150
提交评论