APUE中fcntl.h的使用及O_SYNC在Mac与Ubuntu下的测试
此部分测试涉及到APUE V3中,第三章的图3-12到图3-14。
通过fcntl.h提供的功能,修改fd的文件属性,本处增加O_SYNC功能,并测试其效果。
本文涉及代码:
tree ch3
ch3
├── makefile.sync
├── mycat.c
├── set_fl.c
├── set_fl.h
├── sync.c
└── test
1 不使用O_SYNC功能
mycat.c 代码:
#include "../apue.h" #define BUFFSIZE 4096 int main(void)
{
int n;
char buf[BUFFSIZE];
// set_fl(STDOUT_FILENO, O_SYNC); for O_SYNC
while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > )
if (write(STDOUT_FILENO, buf, n) != n)
err_sys("write error"); if (n < )
err_sys("read error"); exit();
}
2 使用O_SYNC功能的代码
set_fl.h头文件:
#ifndef SET_FL
#define SET_FL void
set_fl(int fd, int flags);
/* flags are file status flags to turn on */ void
clr_fl(int fd, int flags);
/* flags are file status flags to turn off */ #endif
set_fl.c代码:
#include <fcntl.h>
#include "set_fl.h" void set_fl(int fd, int flags)
/* flags are file status flags to turn on */
{
int val; if ((val = fcntl(fd, F_GETFL, )) < )
err_sys("fcntl F_GETFL error"); val |= flags; /* turn on flags */ if (fcntl(fd, F_SETFL, val) < )
err_sys("fcntl F_SETFL error");
}
sync.c代码,即前面mycat.c中,取消set_fl函数 的注释。
makefile.sync文件:
sync: sync.o set_fl.o
gcc -o sync sync.o set_fl.o set_fl.o: set_fl.c
gcc -c set_fl.c
3 测试对比
准备:分别在mac及ubuntu环境下生成一个1GB的文件,并编译文件。
dd if=/dev/zero of=./test bs= count=
+ records in
+ records out
bytes (1.0 GB) copied, 11.1418 s, 94.1 MB/s make -f makefile.sync gcc mycat.c
Ubuntu14.04效果如下:
time ./a.out < test >./dup.buf
real 0m9.965s
user 0m0.014s
sys 0m1.453s time ./sync < test >./dup.sync
real 0m10.355s
user 0m0.025s
sys 0m1.350s
mac10.11效果:
time ./a.out < test >/dev/null
./a.out < test > /dev/null .10s user .17s system % cpu 2.079 total time ./sync < test >/dev/null
./sync < test > /dev/null .10s user .20s system % cpu 2.070 total time ./sync < test >./dup.sync
./sync < test > ./dup.sync .27s user .79s system % cpu 53.369 total time ./a.out < test >./dup.buf
./a.out < test > ./dup.buf .11s user .06s system % cpu 5.955 total
可见,每一次buf数据都直接O_SYNC到磁盘,会影响写磁盘的效果,在mac上几乎近10倍的差异。
而在Ubuntu上,却没有特别明显的差异,如书上所述。通过fcntl对O_SYNC的控制是失效的。
#over
APUE中fcntl.h的使用及O_SYNC在Mac与Ubuntu下的测试的更多相关文章
- sys/types.h fcntl.h unistd.h sys/stat.h
sys/types.h 是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型. 在应用程序源文件中包含 <sys/types.h> 以访问 ...
- [APUE]不用fcntl实现dup2函数功能
dup2的函数定义为: #include <unistd.h> int dup2(int src_fd, int new_fd); 自己实现dup2函数有几个关键点: 1,检查给定的源fd ...
- cocos2dx 3.7中 AppDelegate.h的class TestController;这种写法的具体意思不太明白,只能猜是类似于外部定义的东西。
cocos2dx 3.7中 AppDelegate.h的class TestController;这种写法的具体意思不太明白,只能猜是类似于外部定义的东西.
- 彻底弄清c标准库中string.h里的常用函数用法
在我们平常写的c/c++程序,一些算法题中,我们常常会用到c标准库中string.h文件中的函数,这些函数主要用于处理内存,字符串相关操作,是很有用的工具函数.而且有些时候,在笔试或面试中也会出现让你 ...
- 解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载
解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载 当这两个头文件顺序颠倒时,编译会出现许多莫名其妙的错误,错误如下: 1>…\include\ws2def.h( ...
- 解决Ubuntu下sublime中不能输入中文的问题
解决Ubuntu下sublime中不能输入中文的问题 Ubuntu下安装sublime后,不能输入中文,而在其他软件中能正常输入,这是sublime的bug,解决方案是在通过shell在每次运行sub ...
- Ubuntu下在Eclipse IDE for C/C++ Developers中怎样执行C语言的GTK程序?(已解决)
(已解决.详见Ubuntu 12.04下在Eclipse IDE for C/C++ Developers中执行C语言的GTK程序) 按"Ubuntu下GTK的安装.编译和測试"( ...
- ubuntu下关于profile和bashrc中环境变量的理解(转)
ubuntu下关于profile和bashrc中环境变量的理解(转) (0) 写在前面 有些名词可能需要解释一下.(也可以先不看这一节,在后面看到有疑惑再上来看相关解释) $PS1和交互式运行(r ...
- Ubuntu下编译c文件时,遇到math.h头文件不能编译问题
以前都是在VC或者VS中编写c语言程序,今天尝试在Ubuntu下试着编写了一个简单的画正弦函数的程序,用到了头文件math.h,但是编译的时候报错了: 经查资料后才知道,数学函数位于libm.so库文 ...
随机推荐
- 【每日一linux命令4】常用参数:
下面所列的是常见的参数(选项)义: --help,-h 显示帮助信息 --version,-V ...
- C#中那些[举手之劳]的性能优化
隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒...... 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对大多数程序猿 ...
- OpenCASCADE Shape Location
OpenCASCADE Shape Location eryar@163.com Abstract. The TopLoc package of OpenCASCADE gives resources ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 微框架spark--api开发利器
spark简介 Spark(注意不要同Apache Spark混淆)的设计初衷是,可以简单容易地创建REST API或Web应用程序.它是一个灵活.简洁的框架,大小只有1MB.Spark允许用户自己选 ...
- Java 经典入门(一)
一.什么是 Java 技术?为何需要 Java? Java 是由 Sun Microsystems 在 1995 年首先发布的编程语言和计算平台.有许多应用程序和 Web 站点只有在安装 Java 后 ...
- Mybatis批量删除
<delete id="deleteByStandardIds"> delete from t_standard_catalog where standard_id i ...
- BPM配置故事之案例1-配置简单流程
某天,Boss找到了信息部工程师小明. Boss:咱们新上了H3 BPM,你研究研究把现在的采购申请流程加上去吧,这是采购申请单. 小明:好嘞 采购申请单 小明回去后拿着表单想了想,开始着手配置. 他 ...
- 跟着老男孩教育学Python开发【第五篇】:模块
递归的案例:阶乘 1*2*3*4*5*6*7- def func(num): if num == 1: return 1 return num * func(num - ...
- [学习笔记]JavaScript之函数式编程
欢迎指导与讨论:) 前言 函数式编程能使我们的代码结构变得简洁,让代码更接近于自然语言,易于理解. 一.减少不必要的函数嵌套代码 (1)当存在函数嵌套时,若内层函数的参数与外层函数的参数一致时,可以这 ...