此部分测试涉及到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下的测试的更多相关文章

  1. sys/types.h fcntl.h unistd.h sys/stat.h

    sys/types.h 是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型. 在应用程序源文件中包含 <sys/types.h> 以访问 ...

  2. [APUE]不用fcntl实现dup2函数功能

    dup2的函数定义为: #include <unistd.h> int dup2(int src_fd, int new_fd); 自己实现dup2函数有几个关键点: 1,检查给定的源fd ...

  3. cocos2dx 3.7中 AppDelegate.h的class TestController;这种写法的具体意思不太明白,只能猜是类似于外部定义的东西。

    cocos2dx 3.7中 AppDelegate.h的class TestController;这种写法的具体意思不太明白,只能猜是类似于外部定义的东西.

  4. 彻底弄清c标准库中string.h里的常用函数用法

    在我们平常写的c/c++程序,一些算法题中,我们常常会用到c标准库中string.h文件中的函数,这些函数主要用于处理内存,字符串相关操作,是很有用的工具函数.而且有些时候,在笔试或面试中也会出现让你 ...

  5. 解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载

    解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载 当这两个头文件顺序颠倒时,编译会出现许多莫名其妙的错误,错误如下: 1>…\include\ws2def.h( ...

  6. 解决Ubuntu下sublime中不能输入中文的问题

    解决Ubuntu下sublime中不能输入中文的问题 Ubuntu下安装sublime后,不能输入中文,而在其他软件中能正常输入,这是sublime的bug,解决方案是在通过shell在每次运行sub ...

  7. Ubuntu下在Eclipse IDE for C/C++ Developers中怎样执行C语言的GTK程序?(已解决)

    (已解决.详见Ubuntu 12.04下在Eclipse IDE for C/C++ Developers中执行C语言的GTK程序) 按"Ubuntu下GTK的安装.编译和測试"( ...

  8. ubuntu下关于profile和bashrc中环境变量的理解(转)

    ubuntu下关于profile和bashrc中环境变量的理解(转)   (0) 写在前面 有些名词可能需要解释一下.(也可以先不看这一节,在后面看到有疑惑再上来看相关解释) $PS1和交互式运行(r ...

  9. Ubuntu下编译c文件时,遇到math.h头文件不能编译问题

    以前都是在VC或者VS中编写c语言程序,今天尝试在Ubuntu下试着编写了一个简单的画正弦函数的程序,用到了头文件math.h,但是编译的时候报错了: 经查资料后才知道,数学函数位于libm.so库文 ...

随机推荐

  1. 在Ubuntu下搭建ASP.NET 5开发环境

    在Ubuntu下搭建ASP.NET 5开发环境 0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要做成 ...

  2. iOS二维码生成、识别、扫描等

    二维码扫描 前言: 最近的项目中使用到了二维码,二维码这个模块功能也完成:觉得还是有必要总结一下用来做记录.好长时间没有写二维码了都忘记在差不多了,重新拾起来还是挻快的. 二维码使用场景: 生活中有很 ...

  3. 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(80)-自由桌面

    系列目录 前言 这次我们来做一个有趣的事情,有朋友跟做了很远,找我要自由桌面的代码,这次我们将演示自由桌面的代码. 自由桌面:用户可以随意增删改桌面的布局.个数(只留自己需要看到的数据),这次纯属Ea ...

  5. javascript中的操作符详解1

    好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...

  6. [原创]关于Hibernate中的级联操作以及懒加载

    Hibernate: 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似 ...

  7. TYPESDK手游聚合SDK服务端设计思路与架构之二:服务端设计

    在前一篇文中,我们对一个聚合SDK服务端所需要实现的功能作了简单的分析.通过两个主要场景的功能流程图,我们可以看到,作为多款游戏要适配多个渠道的统一请求转发中心,TYPESDK服务端主要需要实现的功能 ...

  8. 每天一个设计模式-7 生成器模式(Builder)

    每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...

  9. 数据库 DML、DDL、DCL区别 .

    总体解释: DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的 ...

  10. windows 7(32/64位)GHO安装指南(U盘引导篇)~

    上一篇我们说了怎么制作U盘启动盘,那么这一篇让我们来看看如何进行正确的U盘引导启动. 现在的个人计算机一般分为台式机和笔记本,由于各厂商的喜好不同(开玩笑的啦),所以对于主板的BIOS设置各所不同.进 ...