http://lwn.net/Articles/178199/
long splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out,
size_t len, unsigned int flags);
fd_in 에서 fd_out 으로 len 바이트를 이동한다.
데이타는 커널영역에서만 이동한다. 최소한으로 카피가 일어난다.
현재는 fd 둘 중에 하나는 반드시 pipe device 여야 한다.
미래에는 없어질 수도 있다.
off_in, off_out - 데이타 전송을 시작하기 전에 먼저
flags - 카피방법
SPLICE_F_NONBLOCK: non-blocking 그러나 fd 둘중에 하나라도
non-blocking I/O 설정되지 않으면 splice() 는 블록될수 있다.
SPLICE_F_MORE: splice() 이어질 것이라는 커널에게 주는 힌트
SPLICE_F_MOVE: output 이 파일이라면, 커널은 input pipe buffer 를 output address space 로 페이지를 이동한다. 카피는 없다.
splice() 는 pipe buffer 메카니즘을 이용하는데, 이것이 fd 중 한개라도 pipe device 여야 하는 이유가 된다.
ssize_t (*splice_write)(struct inode *pipe, struct file *out,
size_t len, unsigned int flags);
ssize_t (*splice_read)(struct file *in, struct inode *pipe,
size_t len, unsigned int flags);
pipe 를 통해 in, out 사이에 len 바이트를 이동한다.
generic_splice_sendpage() 는 소켓 fd 에 사용된다.