一、五个函数:
open/read/write/lseek/close
二、文件描述符
对内核而言,每个打开文件都是通过文件描述符(其实就是一个非负整数)引用。惯例0标准输入、1标准输出、2标准出错
三、open函数
打开或者创建文件
#include<fcntl.h>
int open(const char *pathname, int oflag, …/*mode_t mode*/)
返回值:成功返回文件描述符,出错返回-1;返回的一定是最小未用的描述符
oflag:O_RDONLY O_WRONLY O_RDWR
可选:O_APPEND;O_CREAT; O_EXCL; O_TRUNC; O_NOCTTY; O_NONBLOCK
四、creat函数
创建文件
#include<fcntl.h>
int creat(const char *pathname, mode_t mode)
返回值:成功返回只写打开的文件描述符,出错返回-1;
等效于open(pathname,O_WRONLY|O_CREAT|O_TRUNC,mode)
五、close函数
关闭一个打开的文件
#include<unistd.h>
Int close(int filedes)
返回值:成功返回0,出错返回-1
关闭文件时,进程会释放加在该文件上的记录锁
进程结束是会释放掉所有打开的文件
六、lseek函数
每个打开的文件都有一个当前文件偏移量(current file offset)——从文件开始处的字节数
#include<unistd.h>
off_t lseek(int filedes, off_t offset, int whence)
返回值:成功返回新的文件偏移量,出错-1;
whence:SEEK_SET; SEEK_CUR; SEEK_END
(负文件偏移量)
七、read函数
从打开的文件读数据
#include<unistd.h>
ssize_t read(int filedes, void *buf, size_t nbytes)
返回值:成功返回读取的字节数,已到文件结尾0,错误-1;
八、write函数
向打开的文件写数据
#include<unistd.h>
ssize_t write(int filedes, const void *buf, size_t nbytes)
返回值:成功返回已写的字节数,出错-1;
写成功后,文件偏移量增加实际写的字节数。
九、文件共享
对于已经打开的文件,内核有三种数据结构表示它:
每个进程都有个进程表项
(1) 文件描述符表
文件描述符标志
指向文件表项的指针
(2) 文件表项
文件状态标志
当前文件偏移量
指向v结点的指针
(3) v结点
打开文件的内核结构
两个独立进程打开同一个文件
每个给定文件只有一个v结点表项,而每个进程都有自己的文件表项:这种安排使每个进程都可以有自己对该文件的当前文件偏移量
十、原子操作
多个进程读同一个文件都能正确工作,但是同时写一个文件就会出现意想不到的结果,因为每个进程都有自己的文件表项,里面存有自己的当前文件偏移量。为了避免这种情况,就需要原子操作。
#include<unistd.h>
ssize_t pread(intfiledes, void *buf, size_t nbytes, off_t offset)
返回值:成功返回读到的字节书,到文件末尾0,出错-1;
ssize_t pwrite(intfiledes, void *buf, size_t nbytes, off_t offset)
返回值:成功返回写的字节数,出错-1;
十一、dup和dup2函数
复制一个现存的文件描述符
#include<unistd.h>
int dup(int filedes)
int dup2(int filedes, intfiledes2)
返回值:成功返回新的文件描述符,出错-1;
dup返回的一定是当前可用的最小的文件描述符,dup2是用filedes2指定新的文件描述符,如果filedes2已经打开,则先将其关闭。
十二、sync、fsync、fdatasync函数
为了保证磁盘上实际文件系统与缓冲区高速缓存中的内容一致性
十三、fcntl函数
改变已打开文件的性质
#include<fcntl.h>
int fcntl(int filedes, intcmd, …/*int arg*/)
fcntl5种功能:
1、 复制一个现有的描述符(cmd= F_DUPFD)
2、 获得/设置文件描述符标记(cmd= F_GETFD /F_SETFD)
3、 获得/设置文件状态标志(cmd= F_GETFL/F_SETFL)
4、 获得/设置异步I/O所有权(cmd =F_GETOWN/F_SETOWN)
5、 获得/设置记录所(cmd =F_GETLK/F_SETLK/F_SETLKW)