演習8-1 K&R プログラミング言語C
2010年03月19日
演習8-1
p208 の syscalls.h
のインクルードの代わりに unistd.h
をインクルードする。
参考:ふつうの Linux プログラミング p80
ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
posted with amazlet at 10.03.11
青木 峰郎
ソフトバンククリエイティブ
売り上げランキング: 26006
ソフトバンククリエイティブ
売り上げランキング: 26006
#include <stdio.h> #include <unistd.h> #include <fcntl.h> int main(int argc, char *argv[]) { int fd; /* ファイルポインタの代わりにファイルディスクリプタを引数にとる filecopy */ void filecopy(int, int); if (argc == 1) { /* 引数なし、標準入力をコピー */ filecopy(0, 1); } else { while (--argc > 0) { if ((fd = open(*++argv, O_RDONLY, 0)) == -1) { fprintf(stderr, "cat: can't open %s\n", *argv); return 1; } else { filecopy(fd, 1); close(fd); } } } return 0; } /* filecopy : ファイル ifd をファイル ofd にコピー */ void filecopy(int ifd, int ofd) { int n; char buf[BUFSIZ]; while ((n = read(ifd, buf, BUFSIZ)) > 0) { write(ofd, buf, n); } }
実行結果
上のコード(ex8-1
)と7章(p197)の cat
第1版 (my_cat1
)とシステムインストール済みの cat
(OSX Snow Leopard版) とで比較してみる。
$ time ./ex8-1 /var/log/system.log >/dev/null real 0m0.063s user 0m0.012s sys 0m0.050s $ time ./my_cat1 /var/log/system.log >/dev/null real 0m0.295s user 0m0.273s sys 0m0.019s $ time cat /var/log/system.log >/dev/null real 0m0.012s user 0m0.001s sys 0m0.011s
システムコールを使った方が標準ライブラリを使ったものよりも速かった。
当然ながら OSX 付属の cat
が最速。
filecopy
でのバッファリングを使わないバージョンでも試してみる。
/* filecopy : ファイル ifd をファイル ofd にコピー (バッファリングなし) */ void filecopy(int ifd, int ofd) { int n; char c; while ((n = read(ifd, &c, 1)) > 0) { write(ofd, &c, n); } }
実行結果
$ time ./ex8-1 /var/log/system.log >/dev/null real 0m49.766s user 0m11.336s sys 0m38.255s
遅っ
プログラミング言語C 第2版 ANSI規格準拠
posted with amazlet at 09.11.27
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
共立出版
売り上げランキング: 9726