Linux 了解open/read/write/close等文件相关系统调用接口,纵向对比fd与FILE结构体

熟悉open/read/write/close等文件相关系统调用接口

1、open函数

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);

注释: 

(1)函数说明:用来打开一个已经存在的文件或者创建一个普通文件 
(2)参数解释: 
pathname:要打开或创建的目标文件 
flags:打开文件时,可以传入多个参数选项,用下面的一个或多个进行“或”运算,构成flags; 

参数:O_RDONLY:只读打开

            Q_WRONLY:只写打开

            O_RDWR:读、写打开 这三个变量只能指定一个 

            O_CREAT:若文件不存在,则创建它。需要使用mode(文件权限标志)选项,来指明新文件的访问权限 

            O_APPEND:追加写 
(3)返回值:成功返回新打开文件的描述符,失败则返回-1 

2、read函数

ssize_t read(int fd,void *buf,size_t count);

(1)函数说明:是从 fd所描述的打开文件中读取 buf所指缓冲区中的 n个字节。 
(2)参数说明 
fd:文件描述符,用来指向要操作的文件的文件结构体 
buf:一块内存空间 
count:请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。 
ssize_t:有符号整型 
(3)返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调用read之前已到达文件末尾,则这次read返回0。 
注意:读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读的字数。

3、write函数

ssize_t write(int fd,const void *buf,size_t count);

注释: 
(1)函数说明:将 buf所指向的缓冲区的 n字节写入 fd 所描述的打开文件中 
(2)参数说明: 
fd:文件指针 
buf:写入的数据保存在缓冲区buf中,同时文件的当前读写位置向后移 
count:请求写入的字节数 
(3)返回值:成功返回写入的字节数,出错返回-1并设置errno写常规文件时,write的返回值通常等于请求写的字节数count,而向终端或者网络写则不一定。

4、close函数

注释: 
(1)函数说明:关闭指定文件 
(2)参数解释:fd—文件描述符,用来指向要操作的文件的文件结构体 
(3)返回值:若成功返回0,出错返回-1; 

注意:关闭一个文件时也释放该进程加在该文件上的所有记录锁,当一个进程终止时,它所有的打开文件都由内核自动关闭。


对比fd与FILE结构体


1、文件描述符fd

概念:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。 
(1)习惯上,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。 
(2)0,1,2对应的物理设备一一般是:键盘,显示器,显示器。 


2、FILE结构体

struct FILE
{
    char *_ptr;//文件输入的下一个位置
    int _cnt;//当前缓冲区的相对位置
    char *_base;//指基础位置(文件的起始位置)
    int _flag;//文件标志
    int _file;//文件的有效性验证
    int _charbuf;//检查缓冲区状况,如果缓冲区则不读取
    int _bufsiz;//文件的大小
    char *_tmpfname;//临时文件名
};

3、(FILE*)文件指针

文件指针指向进程用户区中一个被叫做FILE结构的结构数据。FILE结构包括一个缓冲区和一个文件描述符 。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。

4、文件描述符与文件指针的区别

(1)文件描述符fd只是一个非负整数,在open时产生,起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针file。 
(2)open函数返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表,所有打开的文件都将通过此表中的文件描述符来引用; 
(3)fopen函数返回的是一个文件指针(FILE*),FILE结构是包含有文件描述符的,fopen可以看做是open(fd直接操作的系统调用)的封装,它的优点是带有I/O缓存 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值