- I/O:在主存和外部设备(例如磁盘存储器、终端和网络)之间复制数据的过程。
- 输入操作是从 I/O设备复制数据到主存,而输出操作是从主存复制数据到 I/O设备。
- 所有I/O设备都被模型化为文件。
- Linux shell创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0)、标准输出(描述符为1)和标准错误(描述符为2)
- 每个Linux文件都有一个类型来表明它在系统中的角色:
1、普通文件包含任意数据;2、目录是包含一组链接的文件;3、套接字是用来与另一个进程进行跨网络通信的文件; - 对内核而言,文本文件和二进制文件没有任何区别。区别是相对应用程序而言的。
- 在某些情况下,read和write传送的字节比应用程序要求的要少。这些不足值不表示有错误。出现这样情况的原因有:
1、读时遇到EOF;2、从终端读文本行;3、读和写网络套接字; - st_size成员包含了文件的字节数大小。st_mode成员则编码了文件访问许可位。
- 内核用三个相关的数据结构来表示打开的文件:
1、描述符表;2、文件表;3、v-node表
典型的打开文件的内核数据结构:
文件共享:
- 读和写文件
在系统I/O中读写文件用的系统函数为read()和write()函数来执行
#include <unistd.h>
ssize_t read(int fd,void * buf,size_t n);
ssize_t write(int fd,void *buf,size_t n);
read函数从描述符为fd的当前文件位置拷贝最多n个字节到存储器位置buf。返回值-1表示一个错误,而返回值0表示EOF。否则,返回值表示的是实际传送的字节数量。而write函数从存储器位置buf拷贝至多n个字节到描述符fd的当前文件位置。返回值要么为-1要么为写入的字节数目。