ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
in_fd は読み込みのためにオープンされたファイルディスクリプター、 out_fd は書き込みのためにオープンされたディスクリプターでなければならない。
offset が NULL でない場合、 offset は sendfile() が in_fd のどこからデータを読み始めるかを示すファイルオフセットを保持する変数への ポインターである。 sendfile() は復帰する時、この変数に最後に読み込んだバイトの 次のバイトのオフセットを書き込む。 offset が NULL でない場合、 sendfile() は in_fd のファイルオフセットを変更しない。 NULL の場合は、ファイルオフセットを in_fd から読み込んだバイト数を反映した位置に調整する。
offset が NULL の場合、データは in_fd のファイルオフセットから読み出され、 ファイルオフセットはこの呼び出しで更新される。
count は、ファイルディスクリプター間でコピーするバイト数である。
in_fd 引数は mmap(2) 風の操作ができるファイルを指していなければならな い (ソケットを指定することはできない)。
2.6.33 より前の Linux カーネルでは out_fd はソケットを参照していなければな らない。Linux 2.6.33 以降では、任意のファイルを参照することができる。 通常のファイルの場合には sendfile() はファイルオフセットを適切に変更する。
エラーの場合は -1 が返され、 errno が適切に設定される。
他の UNIX システムでは、異なった方式やプロトタイプで sendfile() を実装している。移植性を考慮したプログラムでは使用すべきではない。
sendfile() を使って TCP ソケットにファイルを送ろうとしていて、 ファイルの内容の前にヘッダーデータを付け加える必要がある場合は、 パケット数を最小にして性能を上げるために tcp(7) に記述されている TCP_CORK オプションを使うといいだろう。
In Linux 2.4 and earlier, out_fd could also refer to a regular file; this possibility went away in the Linux 2.6.x kernel series, but was restored in Linux 2.6.33.
元々の Linux sendfile() システムコールは大きなファイルオフセットを 扱えるように設計されていなかった。その結果、Linux 2.4 で、 ビット幅の大きな offset 引数を持った sendfile64() が追加された。 glibc の sendfile() のラッパー関数はカーネルによるこの違いを吸収している。
sendfile() が EINVAL や ENOSYS で失敗するような場合は、 アプリケーションは read(2)/write(2) に戻すことを考えてもよいかもしれない。
If out_fd refers to a socket or pipe with zero-copy support, callers must ensure the transferred portions of the file referred to by in_fd remain unmodified until the reader on the other end of out_fd has consumed the transferred data.
The Linux-specific splice(2) call supports transferring data between arbitrary file descriptors provided one (or both) of them is a pipe.
[man1]
[man2]
[man3]
[man4]
[man5]
[man6]
[man7]
[man8]
[a]
[b]
[c]
[d]
[e]
[f]
[g]
[h]
[i]
[j]
[k]
[l]
[m]
[n]
[o]
[p]
[q]
[r]
[s]
[t]
[u]
[v]
[w]
[x]
[y]
[z]