ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • splice
    bin/Linux 2008. 4. 24. 14:41
    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 에 사용된다.

Designed by Tistory.