演習8-1 K&R プログラミング言語C

演習8-1

p208 の syscalls.h のインクルードの代わりに unistd.h をインクルードする。
参考:ふつうの Linux プログラミング p80

ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
青木 峰郎
ソフトバンククリエイティブ
売り上げランキング: 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規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»