文件I/O-原子操作

#include<unistd.h>

文件描述符:每一个文件描述符都有一个自己的文件描述符标志和文件指针

)

  • 文件状态标志是指向该给定文件表项的任何进程中的所有文件描述符
  • 每个进程都有自己对于某一个文件的文件偏移量

文件的原子操作

  • ssize_t pread(int fd, void* buf, size_t nbytes, off_t offset)

  • ssize_t pwrite(int fd, const void* buf, size_t nbytes, off_t offset)

  • O_EXCL :创建文件原子操作

dup和dup2

功能 : 复制文件描述符,使返回的文件描述符同fd指向同一文件表项

int dup(int fd):一定返回是当前可用文件描述符的最小数值

int dup2(int fd, int fd2):可以使用fd2指定新描述符的值

:1、 如果fd2已经存在并且打开,则先将其关闭

​ 2、 如果fd = fd2 则直接返回fd2 ,不会关闭。否则清除fd2的FD_CLOEXEC文件描述符标志位

在第一种情况下,dup2包含关闭和复制两个操作,且是原子操作

延迟写

传统unix在内核设有缓冲区高速缓存和页高速缓存。当我们向文件进行写操作的时候,内核通常先将数据复制到缓冲区。然后将写磁盘操作排入队列。

void sync(void):将所有写过的块缓冲区排入队列。并不等待实际磁盘写操作结束。

int fsync(int fd):只对fd指向的文件起作用。并且等待磁盘写操作结束再返回。<只针对数据部分,可能文件属性还没有更新>

int fdatasync(int fd):同fsync一般,同时还会更新文件属性

posted @ 2021-05-12 13:18  blog-morui  阅读(226)  评论(0)    收藏  举报