标签:
十二、函数sync、fsync和fdatasync
延迟写:传统的Unix系统在内核中设有缓冲区或页高速缓冲,大多数磁盘I/O都通过缓冲区进行,当我们向文件写入数据时,内核通常先将数据复制到缓冲区,然后排入队列,晚些时候再写入磁盘。Unix系统提供了sync、fsync和fdatasync三个函数。
#include <unistd.h> int fsync(inf fd); int fdatasync(int fd); //若成功,返回0;若出错,返回-1 void sync(void);
sync只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际磁盘操作结束。通常称为update的喜欢守护进程周期性地调用sync函数,这就保证了定期冲洗(flush)内核的块缓冲区。
fsync函数只对内核文件描述符fd指定的一个文件起作用,并且等待写磁盘操作结束后才返回,其主要应用场景是数据库内应用。
fdatasync函数类似fsync,但他至响应文件的数据部分。而除数据外,fsync还会更新文件的属性。
十三、函数fcntl
#include <fcntl.h> int fcntl(int fd, int cmd, .../*int arg*/); //若成功,则依赖于cmd;若出错,则返回-1
fcntl函数可以改变已经打开文件的属性,有以下5个功能:
1.复制一个已有的描述符(cmd = F_DUPFD 或 F_DUPED_CLOEXEC)
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_SETLKM)
F_DUPFD : 复制文件描述符fd,新文件描述符作为函数返回值,它是尚未打开的各描述符中大于或等于第三个参数值返回。新描述符和fd共享一张文件表项,但是新文件描述符由他自己的一套文件文件描述符标志。其FD_CLOEXEC文件描述符标志被清除。
F_DUPED_CLOEXEC: 复制文件描述符,设置与新描述符关联的FD_CLOEXEC文件描述符标志的值。
F_GETFD : 对应于fd的文件描述符标志作为函数值作为返回。当前只定义了一个文件描述符标志FD_CLOEXEC
F_SETFD : 对于fd设置文件描述符标志。新标志值按第三个参数设置。
F_GETFL : 对应fd的文件状态标志作为函数值返回,其返回值和open的标志位一致。
F_SETFL : 将文件状态标志设置为第三个参数的值:可以更改的几个标志是:O_APPEND、O_NONBLOCK、O_SYNC、O_DSYNC、O_RSYNC、O_FSYNC和O_ASYNC
F_FETOWN : 获取当前接受SIGIO和SIGURG信号的进程或进程组ID
F_SETOWN :设置SIGIO和SIGURG信号的进程ID或进程组ID。正的arg指定一个进程ID,负的arg指定一个进程组ID。
标签:
原文地址:http://www.cnblogs.com/cauchy007/p/5558496.html