一步一步学UC(二) - 文件IO

可用的文件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





一步一步学UC(二) - 文件IO

上一篇:Hadoop:Hadoop的分布式(伪分布式)部署安装


下一篇:Ubuntu下安装Doris、StamPS