分享
 
 
 

APUE学习笔记-文件I/O

王朝学院·作者佚名  2016-05-26
窄屏简体版  字體: |||超大  

APUE学习笔记-文件I/O这次回顾APUE中第三四章的内容,主要是文件I/O操作相关的接口函数。

UNIX系统的文件I/O是不带缓冲的I/O,不带缓冲是指每个read和write都调用系统内核的一个系统调用。

1.文件描述符

UNIX I/O的所有函数都是基于文件描述符来操作的。那什么是文件描述符呢?文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。该文件描述符fd是所有UNIX I/O函数的操作对象。UNIX系统把文件描述符0与进程标准输入关联,把文件描述符1与进程标准输出关联,把文件描述符2与标准错误关联。我们一般在程序中用STDINPUT_FILENO,STDOUTPUT_FILENO,STDERR_FILENO代替这几个文件描述符。文件描述符的范围是0~OPEN_MAX-1。

2.基本I/O函数

#include <fcntl.h>

int open(const char *path,int oflag,.../* mode_t mode */);/*xx*/

int openat(int fd,const char *path,int oflag,.../* mode_t mode */);

【成功返回文件描述符,出错返回-1】

调用open函数打开一个文件,path是要打开或创建的文件的名字,oflag用来说明该函数的多个选项。对于openat函数,在UNIX这一系列I/O函数中有很多类似openat带at后缀的xxat函数,它们的功能与xx函数类似,只不过是xx函数是用文件的绝对路径名来调用,而xxat函数是用文件描述符加上相对路径名来调用,对xxat类函数来说,当path参数指向一个绝对路径名时,其参数fd也失效,此时xxat函数与xx函数相同。(再后面对于这种函数我会用xx注释说明,就不再列出xxat函数了)。

open函数的oflag参数是用多个系统定义的常量做‘或’运算得出。首先是O_RDONLY,O_WRONLY,O_RDWR,O_EXEC,O_SEARCH(这五个常量中必须指定一个且只能指定一个)。剩下的我只列出几个我觉得用的频繁些的:O_APPEND,每次写时都追加到文件末尾;O_CREAT,若此文件不存在则创建,使用该选项时,函数第三个参数mode需指定文件访问权限;O_TRUNC,若文件存在,且是只写或读-写打开,则将文件长度截断为零。

#include <fcntl.h>

int creat(const char *path,mode_t mode);

【成功,返回以WRONLY打开的文件描述符;出错返回-1】

#include <unistd.h>

int close(int fd);【成功,返回0;出错返回-1】

注:当一个进程终止时,内核会自动关闭它打开的所有文件,因此很多程序都利用这一点不显式调用close关闭。

off_t lseek(int fd,off_t offset,int whence);【成功,返回文件新的偏移量;失败返回-1】

whence有三种值:SEEK_SET,此时文件偏移量设置为据文件开始初offset个字节处;SEEK_CUR,此时将文件偏移量设置为其当前值加offset;SEEK_END,此时文件偏移量设置为文件长度加offset。

ssize_t read(int fd,void *buf,size_t nbytes);【成功,返回读到字节数,若已到文件尾,返回零;出错返回-1】

从文件描述符所指文件读n字节到buf数组。ssize_t是带符号返回值int,size_t是unsigned int

ssize_t write(int fd,void *buf,size_t nbytes);【成功,返回已写字节数;出错返回-1】

从buf数组读n字节写入fd所指文件。对普通文件,写操作从文件当前偏移量出开始;对于文件打开时指定了O_APPEND位,每次写操作是在文件末尾。

3.文件共享

UNIX支持在不同进程间共享打开文件。UNIX内核表示打开文件的数据结构如下所示(手机拍的凑合着看):

a.每个进程在进程表中都有一个记录项,记录项包含一张打开文件的文件描述符表,表中每一项关联文件描述符标志及一个指向文件表项的指针。

b.内核为所有打开文件维持一张文件表,每个表项包含文件状态标志,当前文件偏移量,v节点指针。

c.每个打开文件都有一个v节点结构。v节点包含了文件类型和对文件进行各种操作的函数指针。还包含了文件的i节点,i节点包含了文件的所有者,文件长度,指向文件实际数据块在磁盘上的指针等信息。

两独立进程各自打开同一文件的示意图:

#include <unistd.h>

int dup(int fd);【成功,返回新文件描述符,出错返回-1】

复制现有文件描述符,返回的文件描述符是当前可用的文件描述符中最小的那个。

int fsync(int fd);

int fdatasync(int fd);

【成功,返回0,出错返回-1】

void sync(void);

sync只是将所修改的块缓冲区加入写队列,然后就返回,不等待写磁盘操作解数。

fsync只对文件描述符fd指定的文件有用,且要等写磁盘操作完成才返回。

fdatasync类似于fsync,只是fdatasync只影响文件数据部分。

#include <fcntl.h>

int fcntl(int fd,int cmd,.../* arg */);

该函数用于改变已打开文件的属性。fcntl的功能与cmd有关。

To be continued...

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有