Linux基础IO

1.练习open/read/write/close等文件相关系统调用接口,纵向对比fd与FILE结构体

1.open

pathname:打开文件的路径

flags:打开文件的方式

参数:O_RDONLY:只读打开

           O_WRONLY:只写打开

           O_RDWR:读,写,打开     这三个常量,必须指定一个且只能指定一个

           O_CREAT:若文件不存在,怎创建他,需要使用mode选项,来指明新文件的访问权限

           O_APPEND:追加写

返回值:

           成功:新打开的文件描述符

           失败:-1

open函数具体使用哪个,和具体的应用场景有关,如目标文件不存在,需要open创建,怎第三个参数表示创建文件的默认权限,否则,使用两个参数的open

2.read

第一个参数:文件描述符

第二个参数:定义的缓冲区,例如传入一个数组指针

第三个参数:要读入数据的大小

返回值:成功时返回读取到的字节数(为零表示读到文件描述符),此返回值受文件剩余字节数限制,当返回值小于指定的字节数(比如已经接近文件结尾,或者正在从管道或者终端读取数据,或者read()被信号中断),发生错误时返回-1

3.write

第一个参数:文件描述符

第二个参数:写入的内容

第三个参数:写入的字节数。

返回值:成功时返回写入的字节数(若为零则表示没有写入数据),错误时返回-1。

4.close

fd代表文件描述符

open-write

read

测试如下

文件描述符fd

Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0,标准输出1,标准错误2

0,1,2对应的物理设备一般是键盘,显示器,显示器。

 

文件描述符就是从0开始的整数。我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files,指向一张表files_struct,该表最重要的部分就是包含一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标,所以,只要拿着文件描述符,就可以找到对应的文件。

FILE结构体

1、FILE结构体中的成员

缓冲区地址,缓冲区当前指针,缓冲区大小,缓冲区剩余字节数,文件读写方式等。

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

2、(FILE*)文件指针

文件指针指向进程用户区中一个被叫做FILE结构的结构数据。FILE结构包括一个缓冲区和一个文件描述符 。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。 
通常,任何程序运行起来之后都会默认的打开三个标准输入流(stdin:键盘),标准输出流(stdout:显示器),标准错误流(stderr:显示器)。

简单来说,fd是一个一个表示数组下标的小整数。FILE为一个结构体,FILE* 为文件指针,指向文件。

 

文件描述符与文件指针(即指向FILE结构体的指针)区别: 

fd是一个表示数组下标的整数,在打开文件的过程中,起到一个索引的作用,进程通过PCB中的文件描述符找到所指向的文件指针file*。 
open:文件描述符的操作(如:open)返回的是一个文件描述符(int fd),内核会在每个进程空间中维护一个文件描述符表,此表中的文件描述符来引用。 
fopen:流(如:fopen)返回的是一个文件指针(即指向FILE结构体的指针),FILE结构是包含有文件描述符的,fopen可以看做是open(fd直接操作的系统调用)的封装,它的优点是带有I/O缓存

 

 

 

2.编写简单的add/sub/mul/div函数,并打包成动/静态库,并分别使用

这个可以看我的另一篇博客https://blog.csdn.net/Damn_Yang/article/details/83622713

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值