APUE(3)---文件I/O (3)

十二、函数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。

时间: 2024-07-31 14:45:11

APUE(3)---文件I/O (3)的相关文章

unix环境高级编程(第三版)中apue.h文件的配置问题

最近刚开始学习unix环境高级编程(第三版),其中有个作者自己写的apue.h文件,在这归总下相应的配置方法,希望对有需要的朋友们有所帮助 首先http://www.apuebook.com/code3e.html 上去下载相应的压缩包,注意自己书的版本. 下载完成之后,鉴于大多数朋友学习linux都是基于虚拟机的,所以顺便附上虚拟机与本地主机传输文件的方式 首先下载SSH Secure Shell 这个工具,然后直接点击quick connect, 弹出如下界面,输入虚拟机的ip地址,和登录用

【APUE】文件I/O

文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数. 按照惯例,UNIX系统shell使用文件描述符0与进程的标准输入相关联,文件描述符1与标准输出相关联,文件描述符2与标准错误输出相关联. open函数:打开或创建一个文件 #include <fcntl.h> int open(const char *pathname,int oflag,...); pathname是要打开或创建文件的名字,oflag参数用来说明此函数的多个选项 create函数:创建文

(一)一起学 APUE 之 文件 IO

. . . . . 最近在学习 APUE,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习APUE的童鞋们提供一份参考. 本系列博文均根据学习<UNIX环境高级编程>一书总结而来,如有错误请多多指教. APUE主要讨论了三部分内容:文件IO.并发.进程间通信. 文件IO: 标准IO:优点是可移植性高,缺点是性能比系统 IO 差,且功能没有系统 IO 丰富. 系统IO:因为是内核直接提供的系统调用函数,所以性能比标准 IO 高,但是可移植性比标准 IO 差. 并发:

c程序添加apue头文件

#include "apue.h" (c程序添加的头文件) 1. 超级用户权限登入 #cd /usr/include 2. 将apue.h和error.c两个文件copy到该目录下.(apue.h位于 your_apue_path/inlcude ; error.c位于your_apue_path/lib ) 以我的路径为例: #cp /root/apue.2e/inlcude/apue.h . #cp /root/apue.2e/lib/error.c . (实现apue.h中的出错

(三) 一起学 APUE 之 文件和目录

. . . . . 前面两篇博文讲了文件 IO 的基本操作,但是它们操作的都是文件本身所存储的有效数据.而文件系统保存文件的时候不仅仅要存储文件内的数据,还要存储许多亚数据,即文件属性和其它特征数据.这篇博文 LZ 就带领大家讨论文件系统亚数据的操作. 1.stat(2) 1 stat, fstat, lstat - get file status 2 3 #include <sys/types.h> 4 #include <sys/stat.h> 5 #include <u

[13]APUE:(文件)记录锁

[a] 概念 建议锁:在遵循相同记录锁规则的进程间生效,通常用于保证某个程序自身多个进程间的数据一致性 强制锁:意在保证所有进程间的数据一致性,但不一定有效:如不能应对先 unlink 后建立同名副本的行为 [b] fcntl #include <fcntl.h> int fcntl(int fd, int cmd, struct flock *flockp) //出错返回 -1  struct flock { short l_type; //锁类型:F_RDLCK / F_WRLCK / F

(二) 一起学 APUE 之 文件 IO

. . . . . 昨天我们讨论了标准 IO,今天主要说说系统 IO. 1.文件描述符 在 SYSIO 中贯穿了一个整形数,它就是文件描述符.对内核而言,所有打开的文件都是通过文件描述符引用的.它的作用与 STDIO 中的 FILE 结构体类似,但是它们的工作原理是完全不同的.它实际上是一个由内核保存的数组下标,所以不会是负数,下面我会用一张图来表示它的作用. 图1 SYSIO 文件描述符 图是在 Ubuntu 下好不容易找到了一个画图软件画的,质量不怎么样,小伙伴们先凑合着看吧. 我解释下图上

[03]APUE:文件 I/O

[a] open #include <fcntl.h> int open(const char *path, int oflag, ... ,mode_t mode) 成功返回文件描术符, 失败返回 -1 oflag: O_RDONLY / O_WRONLY / O_RDWR / O_EXEC / O_APPEND / O_CLOEXEC / O_CREAT / O_EXCL / O_NONBLOCK / O_NOFOLLOW / O_SYNC / O_TRUNC / O_DSYNC ...

APUE:文件和目录

文件权限有: S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR S_IRWXG = S_IRGRP | S_IWGRP | S_IXGRP S_IRWXO = S_IROTH | S_IWOTH | S_IXOTH 文件类型有: S_ISREG() // 普通文件 S_ISDIR() // 目录 S_ISCHR() // 字符特殊文件(设备) S_ISBLK() // 块特殊文件(设备) S_ISFIFO() // 管道或 FIFO S_ISLNK() // 符号链接

APUE:文件I/O

标准流描述符: /* Standard file descriptors. */ #define STDIN_FILENO 0 /* Standard input. */ #define STDOUT_FILENO 1 /* Standard output. */ #define STDERR_FILENO 2 /* Standard error output. */ 打开.创建.关闭文件: #define O_ACCMODE 0003 /* O_ACCMODE = O_RDONLY | O_W