- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Chapter3 文件操作(本章中描述的都为不带缓冲的I/O函数)不带缓冲的I/O:每个read和write都调用内核中的一个系统调用文件描述符:对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数,当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。当读或者写一个文件时,使用open或create返回的文件描述符标识该文件,将其作为参数传给read或write。文件描述符0(标准输入) ------ STDIN_FILENO 1(标准输出) ------STDOUT_FILENOunistd.h 2(标准错误输出)----STDERR_FILENO函数:(以下函数具体解释请参照《UNIX环境高级编程》)open : int open(const char *pathname, intoflag, …) 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_IRUSR S_IWUSR S_IXUSR S_IRGRP S_IWGRP S_IXGRP S_IROTH S_IWOTH S_IXOTH open、create调用里给出的mode值将与当时的用户掩码的反值做AND操作。close:int close(intfiledes) 成功返回0,出错返回-1当一个进程终止时,内核自动关闭它所有打开的文件文件偏移量:用来度量从文件开始处的字节数,通常读写操作从当前文件偏移量开始,并使偏移量增加所读写的字节数。除非指定O_APPEND,否则为0 文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞,这是允许的,位于文件中但没有写过的字节都被读为0.文件中的空洞并不在磁盘上占用存储区。(相同长度的空洞文件和不含空洞的文件,磁盘块占用数量不同)lseek:显式地为一个打开的文件设置其偏移量lseek中如果文件描述符引用的是一个管道(|)、FIFO(FIFO)或者网络套接字,则lseek返回-1(所以对lseek返回值进行判断时应该判断!=-1),并将error设置为(ESPIPE)lseek仅将当前文件的偏移量记录在内核中,它并不引起任何I/O操作。看书上内容read:从打开的文件中读取数据,如read成功,返回读到的字节数,如已经达到文件末尾,则返回0.write改善I/O性能——预读:当检测到正进行顺序读取时,系统就试图读入比应用程序锁要求的更多数据,并假想应用程序很快就会读这些数据。(这和缓存不同)文件共享(不同进程间共享打开的文件)内核为所有的进程维护一张进程表,一个进程对应进程表中的一项,进程表中的每一项都维护一张文件描述符表,文件描述符表中记录着该进程中打开的文件信息,包括文件描述符标志和文件指针。内核为所有打开的文件维护一张文件表(一个文件描述符表项对应一个文件表表项,每个进程都有自己的文件表项的一个理由是这种安排使得每个进程都有它自己的对该文件的当前偏移量,所以说一个文件有多个文件表项,因为他在不同进程(不同文件描述符)上被打开; 当然也有可能不同进程对同一个文件维护同一个文件表,比如父子进程),一个文件表表项包括文件状态标志、当前文件偏移量、v节点指针,每个打开文件都有一个v节点结构,包含v节点信息、i节点信息、当前文件长度。一个给定文件只有一个v节点表项。Linux中没有v节点,使用inode节点,它是系统中的一个特殊的数据块,它同时还包含文件的长度和文件在磁盘上的存放位置。系统使用的是文件的inode编号,目录结构和文件命名只是为了便于人们使用。(Linux)文件描述符标志和文件状态标志在作用域方面的区别:前者只用于一个进程的一个描述符,而后者则适用于指向该给定文件表项的任何进程中的所有描述符。原子操作:定位搜索和执行I/O成为原子操作:pread/pwrite 允许原子性地定位搜索(seek)和执行I/O调用pread/pwrite时,无法中断其定位和读操作不更新文件指针?测试和创建文件成为原子操作:open函数的O_CREA
您可能关注的文档
- 内科学精品教学(南方医科大学)2016-11-10机械通气.ppt
- 内科学精品教学(南方医科大学)2016-11-10人工气道的建立.ppt
- 南方医院-贾铭-呼吸系统影像一.ppt
- 内科学精品教学(南方医科大学)2016哮喘11月8 OK1.ppt
- 内科学精品教学(南方医科大学)COPD孟莹20161108.pptx
- 内科学精品教学(南方医科大学)肺栓塞 八年制课程整合 2016.ppt
- 内科学精品教学(南方医科大学)肺心病.pptx
- 内科学精品教学(南方医科大学)肺炎.ppt
- 内科学精品教学(南方医科大学)胸膜疾病-新模板放映.pptx
- 内科学精品教学(南方医科大学)原发性支气管肺癌-八年制课程整合.pdf
文档评论(0)