Linux--基础系统I/O【菜鸟学习日记】

时间:2021-11-15 04:58:25

首先理解I/O

输入/输出(I/O)是主存和外部设备(如磁盘、终端和网络)之间拷贝数据的方式。输入是从设备拷贝数据到主存,输出反之。


Unix I/O

所有的I/O设备,如网络、磁盘和终端,都是被模型化为了文件,所有的输入和输出都被当作相对应的文件来读和写操作。
正是因为这种将设备映射为文件的方式,在我们要对一个设备进行操作时只要对向对应的文件进行操作即可,而Unix内核也引出了一个简单、低级的应用接口,UnixI/O,这使得所有的输入和输出都能以一种统一的方式来执行。


打开文件open

  • 一个应用程序通过要求内核打开相应的文件,来宣告它要访问一个I/O设备。
  • 内核返回一个小的非负整数,叫做描述符,它在后续对此文件的操作中标识这个文件。
  • 内核记录有关这个文件文件的所有信息;应用程序只需记住这个描述符。
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h

int open(char *filename,int flags);
int open(char *filename,int flags,mode_t);

//返回:若成功则返回新文件的描述符,出错为-1

filename:要打开或创建的文件
flags:指明了进程打算如何访问这个文件

//具体使用哪个open函数,根据场景,如果目标文件存在,则使用第一个,需要open创建,则需要第三个参数来表示创建文件的的默认权限

flags参数:
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:可读可写

O_CREAT:如果文件不存在,就创建它的一个空文件,需要使用mode选项来指明它的访问权限
O_APPEND:在每次写操作前,设置文件位置到文件的结尾处

例如:fd=Open(”foo.text”,0_RDONLY)
以读的方式打开一个已存在的文件

mode参数

Linux--基础系统I/O【菜鸟学习日记】
Linux--基础系统I/O【菜鸟学习日记】


文件描述符

Linux--基础系统I/O【菜鸟学习日记】

数组里的下标0,1,2分别指向标准输入、标准输出、标准错误

这三个也是缺省默认的

后面从3开始分别对应相应的文件,所以文件描述符其实就是这个数组的对应下标


关闭文件

#include<unistd.h>

int close(int fd);
//fd:文件描述符

返回:若成功为0,出错-1

注意:文件描述符的分配规则

在files_struct数组中,当前没有被使用的最小下标,作为新的文件描述符

注意:重定向fd=1,被关闭时,fd=1就指向了新打开的文件