Linux第五节:基础IO


零、引言

0.1 重谈文件

  1. 空文件,也要在磁盘中占据空间
  2. 文件 = 文件类容 + 文件属性
  3. 文件操作 = 对内容 + 对属性 or 对内容和属性
  4. 标定一个文件,必须使用:文件路径+文件名「唯一性」
  5. 如果没有指明对应的文件路径,默认就是在当前路径进行文件访问
  6. 当我们把fopen/fclose/fread/fwrite 等接口写完,代码编译之后,形成的二进制可执行程序,但是没有运行,文件对应的操作有没有执行呢?
    ----没有----对文件操作就是进程对文件的操作。
  7. 一个文件没有被打开,可以直接进行文件访问吗?----不能----打开文件:用户进程+OS

所以,文件操作的本质:进程与被打开文件的关系。

0.2 重谈文件操作(C语言)

  1. C语言有文件操作接口,C++有文件操作接口,Java、Python、PHP、go、shell 都提供了文件接口操作,但是接口都不一样。
  2. 文件在磁盘上->磁盘是硬件->OS管理硬件->所有人访问磁盘不能绕过OS-> 必须使用OS提供的接口->操作系统只有一个。

所以,上层语言无论如何变化,库函数底层必须调用系统调用接口;库函数可以千变万化,但是底层不变,学习不变的东西就可以降低学习成本。

0.3 C语言文件操作

#include 

// 没有指明路径,自动在当前路径下生成
#define FILE_NAME "log.txt"

int main()
{
	// 1.文件打开
	
	// r 只读, w 只写, r+(不存咋出错)/w+(不存咋创建) 读写, r+b/w+b 二进制形式读写 , a(追加) , a+
	FILE* fp = fopen(FILE_NAME, "w"); 
	if(NULL == fp)
	{
		perror("fopen");
		return 1;
	}

	// 2.文件操作
	int cnt = 5;
	while(cnt)
	{
		fprintf(fp,"%s:%d\n","hello linux file",cnt--);
	}
	// 3.文件关闭
	fclose(fp);
}
  1. 在C语言中,以 w 方式单纯打开文件,会自动清空对应内部数据。
  2. 创建的新文件,默认权限是 -rw -rw- r--
  3. 所以语言级别对文件操作,一定有系统层面的系统调用。

一、系统文件IO

1. 1 使用比特位传递选项

一个比特为一个选项,且不能重复。有点像数据结构中哈希的思想。

// 每一个宏,对应的数值,只有一个比特位是1,彼此位置不重复
#define ONE (1<<0)
#define TWO (1<<1)
#define THREE (1<<2)
#define FOUR (1<<3)

void show(int flags)
{
	if(flags & ONE) printf("one\n");
	if(flags & TWO) printf("two\n");
	if(flags & THREE) printf("three\n");
	if(flags & FOUR) printf("four\n");
}

int mian()
{
	show(ONE); //打印 one
	show(TWO); //打印 two
	show(ONE | TWO); // 打印one和two
}

这样就可以使用不同的标记位打印不同的选项。

1.2 系统接口

// 1.打开文件
// pathname 路径, flags 标记位(读写等选项), mode 权限
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

O_RDONLY: 只读打开
O_WRONLY:只写打开
O_RDWR:读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT:若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND:追加写

// 2.open\close\write\read\seek 这里就举两个例子
#include
ssize_t write(int fd, const void *buf, size_t count); // 覆盖式写入,不会清空内部数据
ssize_t read(int fd, void *buf, size_t count); // 覆盖式写入,不会清空内部数据

二、文件

2.1 如何理解文件

  • 进程可以打开多个文件吗?
    • 可以,系统中一定会存在大量的被打开的文件
    • 被打开的文件会被OS管理起来 ----先描述,再组织
    • OS为了管理被打开的文件,一定会为文件创建对应的 内核数据结构 ----struct file{ };----这里面包含了文件的大部分属性
    • 通过管理这个数据结构来管理文件。

2.2 文件描述符 fd

通过对 open 的学习我们知道了,文件描述符就是一个小整数:1&2&3

  • Linux默认情况下会有三个缺省打开的文件描述符:标准输入 0、标准输出 1、标准错误 2
  • 0、1、2 对应的物理设备一般是:键盘、显示器、显示器,所以输入输出还可以采用一下几种方式:
#include 
#include 
#include 
#include 
#include 
int main()
{
	char buf[1024];
	ssize_t s = read(O, buf, sizeof(buf));
	if(s > 0){
		buf[s] = 0;
		write(1,buf,strlen(buf));
		write(2,buf, strlen(buf));
	}
	return 0;
}

Linux第五节:基础IO_第1张图片
从小到大,按照从小到大且没有被占用的规则来分配fd----fd的分配规则
重定向int dup2(int oldfd, int newfd)oldfd``oldfd拷贝后剩下的的是 oldfd


你可能感兴趣的:(Linux第五节:基础IO)