【UNIX环境高级编程】文件IO详解
定义:文件I/O指的是对文件的输入、输出操作,简单来说就是对文件的读/写操作。
文件描述符
对于内核而言,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数,当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符,当读或写一个文件时,使用open或create返回的文件描述符标识该文件,将其作为参数传送给read或write。
UNIX系统shell使用文件描述符0与进程的标准输入相关联,文件描述符1与标准输出相关联,文件描述符2与标准出错输出相关联。
open函数
打开文件,创建文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//pathname 文件路径 flags 标志(行为)
int open(const char *pathname, int flags);
//创建文件 mode 设置权限
int open(const char *pathname, int flags, mode_t mode);
只有创建文件的时候才会使用第三个参数mode。
- 参数一pathname:是要打开或创建文件的名字。
- 参数二flags:可用来说明此函数的多个选项,可以用一个或多个常量进行"或"运算构成flags参数。
- O_RDONLY:只读打开;
- O_WRONLY:只写打开;
- O_RDWR:读、写打开;
- O_APPEND:每次写时都追加到文件的尾端;
- O_CREAT:若文件不存在则创建它;如果使用这个则必须使用第三个参数mode;
- O_EXCL:如果同时指定了O_CREAT,而文件已经存在,则会出错,用此测试一个文件是否存在,如果不存在则创建此文件;
- O_TRUNC:如果文件存在,而且为只写或读写成功打开,则将其长度截断为0;
- O_NONBLOCK:如果pathname指的是一个FIFO,一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的IO操作设置非阻塞模式;
- O_NOCTTY:如果pathname指的是终端设备,则不将该设备分配作为此进程的控制终端;
- O_DSYNC:使每次write等物理IO操作完成,但是如果写操作并不影响读取刚写入的数据,则不等待文件属性被更新;
- O_RSYNC:使每一个以文件描述符作为参数的read操作等待,直至任何对文件同一部分进行的未决写操作都完成;
- O_SYNC:使每次write都等到物理IO操作完成,包括由write操作引起的文件属性更新所需的IO;
creat函数
调用creat函数创建一个新文件。若成功返回为只写打开的文件描述符,若出错则返回-1。
#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
close函数
调用close函数关闭一个打开的文件。关闭一个文件时还会释放该进程加在该文件上的所有记录锁。若成功返回0,失败返回-1。
当一个进程终止文件时,内核自动关闭它所有打开的文件,很多程序都利用了这一功能而不显示地用close关闭打开的文件。
#include