ファイルから読んだデータを、CPUで加工せずにソケットに送りたいとする。 read(in_fd, buffer, 4096); write(out_fd, buffer, 4096); とか、やりたくなるが、これは実際には非常に無駄で、read 時に、ファイルシステムキャッシュからユーザ空間へコピー、ユーザ空間からskbへコピーしている。 まあ1Gb Etherなら全然大したオーバーヘッドにはならないけど(それがなるんだよなぁ…(なんで?))、NVMe Flash から、100Gb イーサに送るとかすると、memcpy が一回増えるだけで無視できないオーバーヘッドになるので、無駄がある。 そこで sendfile というシステムコールがある。 上のread,writeは sendfile(out_fd, in_fd, NULL, 4096); とか書くと、カーネル内のページをなんかうまくや