APUEにおけるfcntl.hの使用及びO_SYNCのMacとUbuntuでのテスト
5482 ワード
この部分のテストは、APUE V 3、第3章の図3−12〜図3−14に関する.
fcntlを通ります.h提供する機能、fdのファイルの属性を修正して、ここでO_を増加しますSYNC機能を使用して、その効果をテストします.
本明細書では、コードについて説明します.
mycat.cコード:
2 O_を使うSYNC機能のコード
set_fl.hヘッダファイル:
set_fl.cコード:
sync.cコード、すなわち前mycat.cでset_をキャンセルfl関数のコメント.
makefile.syncファイル:
準備:macおよびubuntu環境でそれぞれ1 GBのファイルを生成し、ファイルをコンパイルします.
Ubuntu14.04効果は以下のとおりです.
mac10.11効果:
bufデータは毎回直接O_SYNCからディスクに至ると、書き込みディスクの効果に影響し、macではほぼ10倍の差があります.
Ubuntuでは、本に記載されているように、特に明らかな違いはありません.fcntlでO_SYNCの制御は無効です.
#over
この文書のソース・リンク.
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コード:
1 #include "../apue.h"
2
3 #define BUFFSIZE 4096
4
5 int main(void)
6 {
7 int n;
8 char buf[BUFFSIZE];
9 // set_fl(STDOUT_FILENO, O_SYNC); for O_SYNC
10 while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
11 if (write(STDOUT_FILENO, buf, n) != n)
12 err_sys("write error");
13
14 if (n < 0)
15 err_sys("read error");
16
17 exit(0);
18 }
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, 0)) < 0)
err_sys("fcntl F_GETFL error");
val |= flags; /* turn on flags */
if (fcntl(fd, F_SETFL, val) < 0)
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環境でそれぞれ1 GBのファイルを生成し、ファイルをコンパイルします.
dd if=/dev/zero of=./test bs=512 count=2048000
2048000+0 records in
2048000+0 records out
1048576000 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 0.10s user 1.17s system 60% cpu 2.079 total
time ./sync < test >/dev/null
./sync < test > /dev/null 0.10s user 1.20s system 62% cpu 2.070 total
time ./sync < test >./dup.sync
./sync < test > ./dup.sync 0.27s user 23.79s system 45% cpu 53.369 total
time ./a.out < test >./dup.buf
./a.out < test > ./dup.buf 0.11s user 3.06s system 53% cpu 5.955 total
bufデータは毎回直接O_SYNCからディスクに至ると、書き込みディスクの効果に影響し、macではほぼ10倍の差があります.
Ubuntuでは、本に記載されているように、特に明らかな違いはありません.fcntlでO_SYNCの制御は無効です.
#over
この文書のソース・リンク.