可用的文件I/O函数:打开文件open,读文件read、写文件write,以及lseek,close等
文件描述符:非负整数,0标准输入,1标准输出,2标准出错
open函数:
可以打开或者创建一个文件
#include <fcntl.h>
int open ( const char* pathname,int oflag,......);
pathname 要打开或创建的文件名。
oflag:O_RDONLY 只读
O_WRONLY只写
O_RDWR 读写
以上常量必须指定且只能选择一个,下列常量是可选择的
O_APPEND 追加到文件尾
O_CREAT 若文件不存在,则创建。需要第三个参数指定权限
O_EXCL 如果同时指定了O_CREAT 若文件存在则会出错,检测一个文件是否存在,若不存在则创建
O_TRUNC 如果存在,而且只写或读写成功打开,则将其长度截断为0
O_NOCTTY 若pathname是终端设备,则不将该设备分配为此进程的控制终端
O_NONBLOCK 若pathname是一个FIFO,则设置非阻塞模式
该函数返回文件描述符一定是最小的魏永描述符数值。
creat函数
也可调用creat函数创建一个文件
creat(const char * pathname,mode_t mode);
close函数
关闭一个打开的文件并释放该进程加在该文件上的所有记录锁。
当一个进程终止时,内核自动关闭它所有打开的文件
lseek函数
当前文件偏移量,非负整数,读写都从当前文件偏移量处开始,
off_t lseek(int filedes, off_t offset, int whence)
若 whence是SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节
若whence是SEEK_CUR,则将该文件的偏移量设置为当前值加offset,offset可为正为负
若whence是SEEK_END,则将该文件的偏移量设置为文件长度加offset,offset为可正可负
若执行成功则返回行的文件偏移量,
文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞。
read函数
size_t read(int filedes, void *buf, size_t nbytes);
如果读成功返回字节数,如果到结尾返回0
write函数
调用write函数向打开的文件写数据
#include <unistd.h>
size_t write( int filefd,const void *buf, size_t nbytes);
I/O的效率
当缓冲区长度接近块长时,效率最高。
文件共享
每个进程在进程表中都有一个纪录项,纪录项中包含一张打开文件描述符表。指向一个文件表项的指针
内核为所有打开文件维持一张文件表,包含文件状态标志,当前偏移,指向该文件V节点表项的指针
每个打开文件都有一个v节点结构包含文件类型和对此文件进行各种操作的函数的指针,指向大多数文件还
dup和dup2函数
复制一个现存的文件描述符,成功返回新的描述符 失败返回-1
sync,fsync和fdatasync函数
sync函数将所有修改过的块缓冲区排入写队列然后返回,并不等待实际写磁盘操作结束
fsync 只对文件描述符指定的单一文件起作用,并且等待写磁盘结束返回
fdatasync函数类似fyfnc,但只影响文件的数据部分,
fcntl函数
改变打开的文件的性质
int fcntl( int filedes,int cmd,.......)
ioctl函数
/dev/fd