Linux下标准IO、文件IO,进程、线程、进线程间通信

本人整理不易,如有差错请评论指出,及时论证修改,不传播错误知识点。

1、标准IO与文件IO

对于操作系统而言,I/O操作可以分为两类
 一类是带缓存的IO,又称为标准IO(C标准库中提供了标准IO库,即stdio),它实现了跨平台的用户缓存解决方案。
另一类是Unix/Linux下的文件IO,又称直接IO,即文件访问机制不经过操作系统内核的缓存,数据直接在磁盘和应用程序地址空间进行传输。
 相对而言,直接IO效率更高
https://blog.csdn.net/yang2011079080010/article/details/53759759

标准IO:
https://blog.csdn.net/weixin_45756796/article/details/106711406 <自己的博客>

思考:缓存,在什么位置?具体多大?

文件IO:
Linux中的文件主要分为六大类: “ls -l" 进行查看
普通文件      -
目录文件      d
管道文件      p
设备文件      c
套接字文件	 s
符号链接文件  l

文件描述符
一个 Linux 进程可以打开成百上千个文件,为了表示和区分已经打开的文件,
Linux 会给每个文件分配一个编号(一个 ID),这个编号就是一个整数,被称为文件描述符

1.就是一个整形
2.每个进程默认打开 0、1、2 三个文件描述符, 新的文件描述符都是从 3 开始分配
3.一个文件描述符被回收后可以再次被分配 (文件描述符并不是递增的)
4.每个进程单独维护了一个文件描述符的集合

文件IO与标准IO:
文件IO又叫低级磁盘IO,遵行POSIX相关标准(POSIX表示可移植操作系统接口规范),任何兼容POSIX标准的系统都支持文件IO;
标准IO又叫高级磁盘IO,遵行ANSI C标准,只要开发环境中有标准C库,标准IO即可使用;

注意:linux使用的是glibc,它是标准IO的超集,既包含了ANSI C中定义的函数,也包含了POSIX中定义的函数,因此标准IO和文件IO都可使用

文件IO中用文件描述符表示一个打开的文件,可以访问不同的文件,如:普通文件、设备文件、管道文件等等
标准IO中用FILE(流)表示一个打开的文件,通常只用来访问普通文件。

凡是通过直接IO(文件IO)方式进行数据传输,数据均直接在用户地址空间的缓冲区和磁盘之间进行传输,完全不需要真缓存的支持

思考:用户地址空间的缓冲区是什么?
和磁盘间怎样进行数据的传输?
真缓存是什么?

文件访问方式:
1、标准访问文件的方式:   
  写->用户空间地址的应用缓存->内核地址空间页缓存->物理磁盘—>内核地址空间页缓存->用户空间地址的应用缓存->读

2、直接IO方式
  写->用户空间地址的应用缓存->物理磁盘—>用户空间地址的应用缓存->读
  
3、同步访问文件的方式————<流程与标准访问时一样的>
  数据的读取和写入都是同步操作的,他与标准访问文件的方式不同的是,只有当数据被成功写到磁盘时才返回给应用程序成功的标志。

4、异步访问文件的方式————<流程与标准访问时一样的>
  当访问数据的线程发出请求之后,线程会接着去处理其他事情,而不是阻塞等待,当请求的数据返回后继续处理下面的操作。
  这种访问文件的方式可以明显的提高应用程序的效率,但是不会改变访问文件的效率。

5、内存映射
  指操作系统将内存中的某一块区域与磁盘中的文件关联起来,当要求访问内存中的一段数据时,转换为访问文件的某一段数据。
  这种方式的目的同样是减少数据从内核空间缓存到用户空间缓存的数据复制操作,因为这两个空间的数据是共享的。


	https://blog.csdn.net/en_joker/article/details/98596310 <访问方式>
	https://blog.csdn.net/mg0832058/article/details/5890688 <内存映射>

2、linux下快速搜索文件

1. find <指定目录> <指定条件> <指定动作>————最强大,但慢,根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等
2. locate + 文件名————搜索的是数据库,比find快
3. whereis + 文件名(可执行的二进制文件)
4. which + 命令(查看命令在系统中的位置)
5. type + 命令(查看命令是否是系统自带的命令)
6. grep + r + 字符串 + 大致路径(根据字符串查询)
7. 写函数 lseek();

3、 文件、目录的权限问题

chmod 777 具体文件名————————修改具体文件的权限
chmod 777 *.c——————————————修改所有的.c文件权限
权限具体:  -rw-rw-r--   *** —— 111 ( 4+2+1=7 )
			最前面那个 - 代表的是类型(普通文件)
			中间那三个 rw- 代表的是所有者(user) 
			然后那三个 rw- 代表的是组群  (group)
			最后那三个 r-- 代表的是其他人(other)

4、文件锁

文件锁主要是用于多个程序共同操作一个文件的情况,锁分为:1.建议性锁  2.强制性锁
1. 建议性锁,要求每个相关程序在访问文件时候都先检查是否有锁存在,并尊重已有锁,不建议,因为无法保证都检查
2. 强制性锁,由内核执行,当一个文件被上锁,进行写入操作的时候,内核将阻止其他任何程序对该文件进行读写操作。

对文件上锁的函数有lockf()和fctnl();
lockf()是建议性锁,而fctnl()包含建议性锁、也保护强制性锁,还包含记录锁。
记录锁又分读取锁和写入锁,读取锁又称共享锁&
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值