文件IO大纲
- 文件流与文件描述符的区别
a) 任何进程在运行时都默认打开3个流对象,(stdin, stdout, stderr)它们都有对应的文件描述符,其文件描述符分别为0,1,2,以后打开的文件描述符的值一般都选用未使用的最小值
b) LINUX为管理每个每个进程打开的文件,在进程的私有结构体struct task_struct(即进程PCB,由内核提供)中,对任何进程来说,都将为这个结构体专门分配管理打开文件信息的表项,用以指示当前进程打开的文件结构体,通俗点解释就是每一个进程都在内核的struct task_struct结构体中有一个信息表项,然后这个表项指向这个进程所打开的文件列表,然后文件列表中的文件描述符指向具体打开的文件结构信息
c) 文件描述符与文件流的转换操作
linux为用户层提供了函数fileno( )以从文件流中读取其文件描述符
extern int fileno( FILE *__stream)
函数fdopen( )将实现某个流与一个文件描述符的连接
extern FILE *fdopen ( int __fd, __const char *__modes),这里需要使用fprintf( )来操作流对象。
有了上述对流,对文件描述符的较深入的了解,接下来学习POSIX标准下的文件IO管理就会有更多自己的体会。
- fopen( ), fread( ), fwrite( ), fclose( ), open( ), read( ), write( ), close( ), creat( ), lseek( )
文件打开flags标识一览:
O_RDONLY
O_WRONLY
O_RDWR,
O_CREAT
O_EXCL若同O_CREAT一起使用,如果文件已经存在报错
O_NOCTTY 如果打开终端设备,不将其作为进程控制终端机
O_TRUNC 若文件存在并且可读可写,将文件内容清空
O_APPEND 读写文件时从文件尾部开始
O_NONBLOCK以非阻塞方式打开,执行后立即返回
O_NDELAY 同O_NONBLOCK
O_SYNC 同步方式打开文件,关闭文件前,将缓存写入
O_LARGEFILE 在32位系统下支持大于2G文件打开操作
文件打开权限一览:
S_I(R/W/X)(USR/GRP/OTH),S_IRWXU, S_IRWXO, S_IRWXG
以上是系统函数权限设置标识,用户函数不同,如“r+”“w+”等
自己做笔记添加进来。
- 文件控制fcntl( )函数,用于修改某个文件描述符的特殊属性,复制文件描述符,获取文件描述符,设置文件描述符,获取文件状态设置文件状态
- 映射文件到内存mmap( )
- 锁定/解锁文件
函数flock( ) 和 函数fcntl( )都可以提供对文件的锁操作,但是flock( )只能锁定整个文件,不能锁定某个区域,而fcntl( )可以提供任意位置的内容锁定。
- 目录流的基本操作-----目录文件中存储的是该目录下所有的文件以及子目录文件的信息
a) 打开/关闭目录文件
DIR *opendir( const char *dirname)
DIR *closedir( const char *dirname) 返回一个目录流指针
b) 读/写目录内容
c) 定位目录内容
d) 添加和删除目录
e) 获取当前工作路径
7.以上关于文件的操作只是基本的关于文件操作内容,还有一块内容,是关于对普通文件,连接文件及目录文件属性的读取修改等操作,这块内容大家自己学习,不进行讲授。