Linux文件基础I/O(上)

简介: Linux文件基础I/O

文件的常识

1.空文件也要在磁盘占据空间

2.文件 = 内容 + 属性

3.文件操作 = 对内容 + 对属性

4.标定一个文件,必须使用文件路径 + 文件名(唯一性)

5.如果没有指明对应的文件路径,默认是在当前路径进行访问

6.当我们把fopen,fclose,fread,fwrite等接口写完之后,代码编译之后,形成二进制可执行程序之后,但是没运行,文件对应的操作有没有被执行呢?没有 —— 对文件操作的本质是进程对文件的操作。

7.一个文件如果没被打开,可以直接进行文件访问吗??不能!一个文件要被访问,就必须先被打开!(被打开的时候是用户调用端口,操作系统负责操控硬件,所以这个操作是用户进程和操作系统共同完成的)

8.磁盘的文件不是所有的都被打开,是一部分被打开,一部分关闭。

总结:文件操作的本质是进程和被打开文件之间的关系。

基础IO

为什么要学习操作系统的文件操作

语言中,C,C++,java,python,php都有文件操作的接口,可是每个接口都不一样。

但是文件是在磁盘中,磁盘是硬件,那么想访问文件就不能绕过操作系统,要使用操作系统提供的接口。

但是操作系统的接口是不会变的,语言层面的操作文件也是通过对操作系统的这些接口进行封装而已。

所以学习底层操作系统能让我们在以后学习其他语言上手更快。

C语言对于函数接口的使用

w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

wb只写方式打开或新建一个二进制文件,只允许写数据。

wb+读写方式打开或建立一个二进制文件,允许读和写。

r打开只读文件,该文件必须存在,否则报错。

r+打开可读写的文件,该文件必须存在,否则报错。

rb+读写方式打开一个二进制文件,只允许读写数据。

a以附加的方式打开只写文件。

a+以附加方式打开可读写的文件。

ab+读写打开一个二进制文件,允许读或在文件末追加数据。加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。

接口函数介绍

首先注意一个细节,文件的起始掩码是666,创建出文件是这样得出权限的:666 & ~numask。

先说第一个参数是包含路径的文件名(没有默认就是当前路径),第二个参数是你要进行什么操作,是一个C传标记为,靠比特位得到信息的参数,第三个参数是输入权限,起始文件的权限就是0666.。

正确返回值是文件描述符(其实就是一个小整数,下面会说明由来),错误是-1。

注意:在使用open时,如果不存在该文件,一定要注意第二个参数要传什么参数,第三个参数是必须要传的,不然就是错误文件。

这个函数可以传三个参数的原因就是为了处理不存在的文件。

这里先说一下C传标记位。

假如有八个比特位,每个比特位变成1,其他均为0,那么就有8种:

那么到时候就可以这样用:

#include<stdio.h>
#define ONE (1 << 0)
#define TWO (1 << 1)
#define FOUR (1 << 2)
#define EIGHT (1 << 3)
void print(int x)
{
  if(x&ONE)
    printf("ONE\n");
  if(x&TWO)
    printf("TWO\n");
  if(x&FOUR)
    printf("FOUR\n");
  if(x&EIGHT)
    printf("EIGHT\n");
}
int main()
{
  print(ONE);//打印ONE
  print(ONE|TWO);//打印ONE,TWO
  print(ONE|TWO|FOUR)//打印ONE,TWO,FOUR
  print(ONE|TWO|FOUR|EIGHT)//打印ONE,TWO,FOUR,EIGHT
  return 0;
}

open函数的第二个参数也是同样的道理:

O_RDONLY: 只读打开

O_WRONLY: 只写打开

O_RDWR : 读,写打开

这三个常量,必须指定一个且只能指定一个

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

O_APPEND: 追加写

O_TRUNC : 清空文件中的内容

注意:这里只读和只写进行 | 操作只是为了没有对应文件去创建一个文件,如果这里既想实现读又想实现写的功能不能这样写,要用O_RDWR,因为只读和只写的特殊位都是一个位置,只不过是相反,也就是说总会有一个不起作用,下面写起了作用就代表读不会起作用。

这里就创建了一个文件,权限是对应666.

这里注意一下,umask设置的是当前进程的,跟shell的没关系。

这是系统写入函数:

第一参数是你要写入的是文件描述符,第二参数是我们要写入缓冲区的位置,第三个是你要放进去的大小,返回值后面再说。

第二个参数是是void*,这是因为文本可以纯文本和二进制读取,但是在操作系统看来都是二进制,这个分类其实是语言给的分类。

经过上面的举例其实就会发现C语言调用的fopen其实就是在传参给open上面的四个参数而已。

这是从文件中读取内容的函数.

第一个参数是文件描述符,第二个参数是从特定文件读取内容到缓冲区,第三个参数是读取多少个,实际上输入的500,如果缓冲区只有50,那么它只会读取50。

第二个参数也是void*,也是没有类型概念的。

如何理解文件

文件操作的本质:进程和被打开文件的关系。

首先进程是可以打开多个文件的,系统中一定会有大量被打开的文件,那么如何管理这些文件呢?其实就像管理进程一样,先描述,再组织,先来看这一段代码:

这里发现文件是有顺序的,那么为什么不像数组一样从0开始呢?

因为有三个标准输出流的存在:

stdin ——>键盘

stdout ——>显示器

stderr ——>显示器

这三个就是排在前面顺序的!

并且,C语言的FILE指针是一个结构体,因为在系统层面只认识文件描述符,所以里面必定有一个字段是文件描述符。

所以是从0开始的,但是前三个被占用了。

那么数字为什么是从0开始的呢?

磁盘中被进程打开到内存中然后是通过struct file这个类型来描述放到内存中,然后进程的PCB中里面有一个struct file_struct *files这个指针指向一个struct file*array[]的数组来管理这些文件。

总结:文件描述的本质就是数组的下标!

相关文章
|
4月前
|
Linux 开发工具
7种比较Linux中文本文件的最佳工具
7种比较Linux中文本文件的最佳工具
7种比较Linux中文本文件的最佳工具
|
2月前
|
存储 数据管理 Linux
区分Linux中.tar文件与.tar.gz文件的不同。
总之,".tar"文件提供了一种方便的文件整理方式,其归档但不压缩的特点适用于快速打包和解压,而".tar.gz"文件通过额外的压缩步骤,尽管处理时间更长,但可以减小文件尺寸,更适合于需要节约存储空间或进行文件传输的场景。用户在选择时应根据具体需求,考虑两种格式各自的优劣。
245 13
|
3月前
|
安全 Linux
Linux赋予文件000权限的恢复技巧
以上这些步骤就像是打开一扇锁住的门,步骤看似简单,但是背后却有着严格的逻辑和规则。切记,在任何时候,变更文件权限都要考虑安全性,不要无谓地放宽权限,那样可能
101 16
|
3月前
|
存储 Linux 数据处理
深入剖析Linux中一切即文件的哲学和重定向的机制
在计算机的奇妙世界中,Linux的这套哲学和机制减少了不同类型资源的处理方式,简化了抽象的概念,并蕴藏着强大的灵活性。就像变戏法一样,轻轻松松地在文件、程序与设备之间转换数据流,标准输入、输出、错误流就在指尖舞动,程序的交互和数据处理因此变得既高效又富有乐趣。
45 4
|
4月前
|
Linux
【Linux】 Linux文件I/O常见操作技巧
以上就是Linux文件I/O操作的一些技巧,接纳它们,让它们成为你在Linux世界中的得力伙伴,工作会变得轻松许多。不过记住,技巧的运用也需要根据实际情况灵活掌握,毕竟,最适合的才是最好的。
114 28
|
4月前
|
Ubuntu Linux
"unzip"命令解析:Linux下如何处理压缩文件。
总的来说,`unzip`命令是Linux系统下一款实用而方便的ZIP格式文件处理工具。本文通过简明扼要的方式,详细介绍了在各类Linux发行版上安装 `unzip`的方法,以及如何使用 `unzip`命令进行解压、查看和测试ZIP文件。希望本文章能为用户带来实际帮助,提高日常操作的效率。
496 12
|
3月前
|
Linux
linux文件重命名命令
本指南介绍Linux文件重命名方法,包括单文件操作的`mv`命令和批量处理的`rename`命令。`mv`可简单更改文件名并保留扩展名,如`mv old_file.txt new_name.txt`;`rename`支持正则表达式,适用于复杂批量操作,如`rename &#39;s/2023/2024/&#39; *.log`。提供实用技巧如大小写转换、数字序列处理等,并提醒覆盖风险与版本差异,建议使用`-n`参数预览效果。
|
5月前
|
Linux Shell
Linux系统下快速批量创建和删除文件的方法
总的来说,使用shell脚本来批量处理文件是一种非常强大的工具,只要你愿意花时间学习和实践,你会发现它能大大提高你的工作效率。
259 19
|
6月前
|
监控 Linux
Linux基础:文件和目录类命令分析。
总的来说,这些基础命令,像是Linux中藏匿的小矮人,每一次我们使用他们,他们就把我们的指令准确的传递给Linux,让我们的指令变为现实。所以,现在就开始你的Linux之旅,挥动你的命令之剑,探索这个充满神秘而又奇妙的世界吧!
121 19
|
6月前
|
Linux
Linux 常用文件查看命令
`cat` 命令用于连接文件并打印到标准输出,适用于快速查看和合并文本文件内容。常用示例包括:`cat file1.txt` 查看单个文件,`cat file1.txt file2.txt` 合并多个文件,`cat &gt; filename` 创建新文件,`cat &gt;&gt; filename` 追加内容。`more` 和 `less` 命令用于分页查看文件,`tail` 命令则用于查看文件末尾内容,支持实时追踪日志更新,如 `tail -f file.log`。
186 5
Linux 常用文件查看命令