输入、输出、文件的概念
- 普通文件:文本文件(只含有ASCII或Unicode字符的普通文件、包含若干文本行以
\n
结束)、二进制文件(其他普通文件) - 目录:包含一组连接(link)的文件(文件名
.
该目录自身的链接、..
该目录的父目录的链接、文件的链接、其他目录的链接) - 套接字:与另一个进程进行跨网络通信的文件
LInux内核IO函数
Linux系统使用由操作系统内核提供的系统级Unix I/O函数实现IO
打开文件
- 应用程序要求内核打开相关文件,来声明使用某个IO设备。
- 并返回一个非负整数(描述符:在当前进程中当前未被打开的最小描述符,一般从3开始)
- linux shell在每个进程开始时自动打开三个文件(0-标准输入STDIN_FILENO、1-标准输出STDOUT_FILENO、2-标准错误STDERR_FILENO)。
#include <sys/types.h> //操作系统的基本数据类型
#include <sys/stat.h> //文件的全部属性
#include <fcntl.h> //控制描述符
int open(char *filename,int flags,mode_t mode);//将filename转为文件描述符
- 访问方式参数int flags:
宏名|作用
-|-
O_RDONLY|只读
O_WRONLY|只写
O_RDWR|可读写
O_CREAT|若存在则覆盖(不存在就创建)
O_TRUNC|若存在则覆盖(不存在不创建)
O_APPEND|若存在则追加结尾(不存在不创建) - 文件访问权参数mode_t mode:由3个bit组成,从左到右依次为拥有者、拥有者所在组、其他人(anyone)的权限(每个bit的值为R=4读权限、W=2写权限、X=1执行权限)
- 每个进程都用umask函数可以设置一个umask的值、最终打开文件时的文件访问权为:mode&~umask、通常为
umask(0)
mode_t umask(mode_t mask);
关闭文件
应用程序要求内核关闭文件、由内核释放文件打开时创建的数据结构、描述符变为当前未被打开的描述符、当进程结束时也可自动调用关闭所有文件并释放内存资源、当前文件位置k=0
改变当前文件位置k
对于每个打开的文件、内核中始终保持一个文件位置k(从文件开头起始的字节偏移量、初始值为0)
读取文件
从m个字节的文件当前位置k,复制n个字节到内存,并将文件当前位置更新为k+n。当k≥m时,会触发EOF条件
写入文件
从文件的当前位置k开始,把内存的n个字节复制,并将文件当前位置更新为k+n