質問: read(fd, &c, sizeof(c))) > 0){ write(df, &c, n); count++; } printf("ループカウンタ:%zu\n", count); close(fd); close(df); return 0; } ``` ### 実験プログラムの結果 512kバイトの元データをプログラムに与えた場合 ------512バイトのバッファ有り------- ・標準出力結果 ループカウンタ:1000 ・システムコール回数 write 1000 read 1001 ・実行速度 real 0m0.036s user 0m0.003s sys 0m0.018s ・コピー先ファイルのサイズ 512kバイト コピーできている -----バッファなし(1バイトずつ処理)----- ・標準出力結果 ループカウンタ:512000 ・システムコール回数 write 8075 read 8076 ・実行速度 real 0m0.653s user 0m0.094s sys 0m0.552s ・コピー先のファイルサイズ 512kバイト コピーできている ### 疑問点 512kバイトのデータを512バイトのバッファに格納して処理する場合、システムコールを1000回呼んで1001回目にデータがもうないのでループを抜けるのはわかります。結果もそのようになったので納得です。 一方、バッファなしで1バイトずつ処理する場合は、readを512000回呼んで512001回目にデータがもうないのでループを抜けると思うし、ループカウンタも512000回になっているのですが、システムコールは8075回という値が示されてしまいます。自分はシステムコール回数の結果も512000回だと思うのですがなぜこの様な結果になってしまうのでしょうか? コピー先のファイルサイズはちゃんと512kバイトあるのでプログラムとしてはちゃんと動いていそうなのですが... よろしくお願いします。
回答: 回答では無いですが、Linuxで、`strace -c`で調べると下記になりました。 ``` ループカウンタ:512000 % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 55.36 2.558412 5 512001 write 44.64 2.062902 4 512002 read 0.00 0.000000 0 8 4 open 0.00 0.000000 0 4 close 0.00 0.000000 0 4 3 stat 0.00 0.000000 0 3 fstat 0.00 0.000000 0 9 mmap 0.00 0.000000 0 3 mprotect 0.00 0.000000 0 1 munmap 0.00 0.000000 0 1 brk 0.00 0.000000 0 1 1 access 0.00 0.000000 0 1 execve 0.00 0.000000 0 1 arch_prctl ------ ----------- ----------- --------- --------- ---------------- 100.00 4.621314 1024039 8 total ```