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。
#include "apue.h"
#include <fcntl.h> int main(int argc, char *argv[])
{
int val;
if(argc != )
{
err_quit("usage : a.out <descripor#>");
} if((val = fcntl(atoi(argv[]), F_GETFL, )) < )
{
err_sys("fcntl error for fd %d\n", atoi(argv[]));
} switch(val & O_ACCMODE)
{
case O_RDONLY:
printf("read only");
break;
case O_WRONLY:
printf("write only");
break;
case O_RDWR:
printf("read write");
break;
default:
err_dump("unknow access mode");
} if(val & O_APPEND)
{
printf(", append");
} if(val & O_NONBLOCK)
{
printf(", nonblocking");
} if(val & O_SYNC)
{
printf(", synchronous writes");
} // #if !defined_ ( _POSIX_C_SOURCE) && defined_(O_FSYNC) && (O_FSYNC != O_SYNC)
if(val & O_FSYNC)
{
printf(", synchronous writes");
}
// #endif putchar('\n');
exit();
}
3-5:对于指定的描述符打印文件标志
在修改文件描述符标志或文件状态标志时必须谨慎,先要获得现在的标志值,然后按期望值修改他,然后设置新标志值。不能只是执行F_SETFD或F_SETFL命令,这样会关闭以前设置的标志位:
void set_fl(int fd, int flags)
{
int val;
if((val = fcntl(fd, F_GETFL, )) < )
{
err_sys("fcntl F_GETFL error");
} val |= flags; if(fcntl(fd, F_SETFL, val) < )
{
err_sys("fcntl F_SETFL error");
}
}
3-6:对一个文件描述符开启一个或多个文件状态标志
在Unix系统中,通常write只是将数据排入队列,而实际的写磁盘操作则可能在以后的某个时刻进行。而数据库系统则需要使用O_SYNC,这样一来,他从write返回时就知道数据已确实写到了磁盘上,以免在系统异常时产生数据丢失。数据的安全性得到了保证,其代价是设置O_SYNC会显著增加系统时间和时钟时间。
十四、函数ioctl和/def/fd
iotl函数一直是I/O操作的杂物箱。不能用本章其他函数表示的I/O操作通常都能用ioctl标识。终端I/O是使用ioctl最多的地方。
较新的系统都提供名为/dev/fd的目录,其目录项是名为0、1、2等的文件。打开文件/dev/fd/n等效于复制描述符n。
APUE(3)---文件I/O (3)的更多相关文章
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- apue.h文件找不到的解决办法
参考:http://blog.csdn.net/nihaotoyou/article/details/16827675 1.首先到该书的官网下载源代码:http://www.apuebook.com/ ...
- 【APUE】文件I/O
Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file descri ...
- [apue] 使用文件记录锁无法实现父子进程交互执行同步
父子进程间交互执行是指用一种同步原语,实现父进程和子进程在某一时刻只有一个进程执行,之后由另外一个进程执行,用一段代码举例如下: SYNC_INIT(); , counter=; pid_t pid ...
- [apue] linux 文件访问权限那些事儿
前言 说到 linux 上的文件权限,其实我们在说两个实体,一是文件,二是进程.一个进程能不能访问一个文件,其实由三部分内容决定: 文件的所有者.所在的组: 文件对所有者.组用户.其它用户设置的权限访 ...
- [11]APUE:(文件)记录锁
[a] 概念 建议锁:在遵循相同记录锁规则的进程间生效,通常用于保证某个程序自身多个进程间的数据一致性 强制锁:意在保证所有进程间的数据一致性,但不一定有效:如不能应对先 unlink 后建立同名副本 ...
- [04]APUE:文件与目录
[a] stat / lstat / fstat #include <sys/stat.h> int stat(const char *restrict pathname, struct ...
- [03]APUE:文件 I/O
[a] open #include <fcntl.h> int open(const char *path, int oflag, ... ,mode_t mode) 成功返回文件描术符, ...
- 重读APUE(5)-文件权限
文件,目录,权限 1. 用名称打开任一个类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应该具有执行权限:这就是目录执行权限通常被称为搜索位的原因: 例如:为了打开文件/usr ...
随机推荐
- python学习笔记(十三): 多线程多进程
一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...
- RPC框架的服务注册和发现
https://www.cnblogs.com/valor-xh/p/6281502.html https://blog.csdn.net/listslim1/article/details/5157 ...
- Tkinter Dimensions
Tkinter Dimensions: 各种长度,宽度,和其他部件的尺寸可以在许多不同的单位描述 各种长度,宽度,和其他部件的尺寸可以在许多不同的单位描述. 如果您设置了尺寸为整数,它被假定为 ...
- vue组件重新加载(刷新)
vue组件重新加载(刷新) 第一种方法:利用v-if控制router-view,在根组件APP.vue中实现一个刷新方法 <template> <router-view v-if=& ...
- Nginx 安装与使用
作者:吴秦出处:http://www.cnblogs.com/skynet/ 前言 nginx Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一 ...
- 什么是web资源????
所谓 web 资源即放在 Internet 网上供外界访问的文件或程序,又根据它们呈现的效果及原理不同,将它们划分为静态资源和动态资源. 1. 什么是静态资源 静态资源是浏览器能够直接打开的,一个 j ...
- MongoDB系列[2]:MongoDB导入导出以及数据库备份
PS: 以下所有操作都是基于MongoDB自带的工具进行的,所以操作时一定要手动切换到Mongodb的bin目录下面,并且使用管理员权限运行命令 导出工具 mongoexport 概念: mongoD ...
- 【ZOJ 3228】Searching the String 【AC自动机】
题意 给出n个模式串和一个文本串,输出各个模式串在文本串中出现的次数.模式串有两种类型,0类型代表可以有重叠,1类型代表不能有重叠.模式串可能出现重复. 分析 算是AC自动机的模板题? 因为模式串可以 ...
- 【总结整理】UGC内容
除了内容了产品,还有什么适合引入UGC? :引发讨论,诱导参与,然后促成销售. User Generated Content,也就是用户生成内容的意思. 购买类产品,内容催生购买 1.为用户购买提供思 ...
- iOS8 无缝切换WKWebView,借鉴IMYWebview,解决进度条,cookie,本地页面等问题
webkit使用WKWebView来代替IOS的UIWebView和OSX的WebView,并且使用Nitro JavaScript引擎,这意味着所有第三方浏览器运行JavaScript将会跟safa ...