SENDFILE(2)

명칭
sendfile - 파일을 소켓에 송신

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/socket.h> <sys/uio.h> int sendfile(int fd, int s, off_t offset, size_t nbytes, struct sf_hdtr *hdtr, off_t *sbytes, int flags)

해설
sendfile() (은)는, 기술자 fd 에 의해 지정된 통상의 파일을, 기술자 s 에 의해 지정된 스트림 소켓으로부터 송신합니다.

offset 인수는 파일의 어디에서 개시해야할 것인가를 지정합니다. nbytes 인수는, 파일의 몇 바이트를 송신할 필요가 있는지를 지정합니다. 0 은, 파일의 마지막까지 송신한다고 하는 특수한 의미를 가집니다.

옵션의 헤더 또는 부속차, 또는 그 양쪽 모두는, 구조체 sf_hdtr 를 가리키는 포인터를 지정하는 것에 의해 파일의 전과 다음에 송신할 수 있습니다. 구조체 sf_hdtr 의 구조는 다음과 같습니다.

    struct sf_hdtr {
    	struct iovec *headers;  /* 헤더 iovecs 를 가리키는 포인터 */
    	int hdr_cnt;            /* 헤더 iovecs 의 수 */
    	struct iovec *trailers; /* 부속차 iovecs 를 가리키는 포인터 */
    	int  trl_cnt;           /* 부속차 iovecs 의 수 */
    };

headers 포인터와 trailers 포인터는, NULL 가 아닌 경우에 구조체 iovec 구조의 배열을 가리킵니다. iovec 구조체의 상세한 것에 대하여는, writev() 시스템 콜을 참조해 주세요. 이러한 배열내의 iovecs 의 수는, hdr_cnt (와)과 trl_cnt 에 의해 지정됩니다.

NULL 가 아닌 경우에, 시스템은, 소켓상에 송신된 합계 바이트수를, sbytes 에 의해 가리켜진 변수에 기록.

flags 인수는 현시점에서는 미정도리이며, 0 으로 지정할 필요가 있습니다.

비블로킹 입출력용으로 지정된 소켓을 사용할 경우에, sendfile() (은)는 요구되었던 것보다도 적은 바이트를 송신하는 일이 있습니다. 이 경우, 정상적으로 쓰기바이트수가 *sbytes (지정되어 있는 경우)에 돌려주어져 에러 EAGAIN 하지만 돌려주어집니다.

실장에 관한 주
sendfile() 의 FreeBSD 에서의 실장은 「0 카피」입니다. 즉, 파일 데이터의 카피 하지만 회피되도록(듯이) 최적화되고 있습니다.

반환값

에러

[EBADF]
    fd 하지만 유효한 파일 기술자가 아닙니다.

[EBADF]
    s 하지만 유효한 소켓 기술자가 아닙니다.

[ENOTSOCK]
    s 하지만 소켓이 아닙니다.

[EINVAL]
    fd 하지만 통상의 파일이 아닙니다.

[EINVAL]
    s 하지만 SOCK_STREAM 형의 소켓이 아닙니다.

[EINVAL]
    offset 하지만 부인지, 또는 범위외입니다.

[ENOTCONN]
    s (은)는, 미접속의 소켓을 가리키고 있습니다.

[EPIPE]
    통신 상대가 접속을 닫아 버렸습니다.

[EIO]
    fd (으)로부터 읽기중에 입출력 에러가 발생했습니다.

[EFAULT]
    파라미터에 대해 무효인 주소가 지정되었습니다.

[EAGAIN]
    소켓은 비블로킹 입출력과 지정되어 있어 소켓 버퍼가 만배이기 위해서(때문에) 모든 데이터가 송신되지 않았습니다. sbytes 가 지정되었을 경우, 송신이 정상적으로 완료한 바이트수가 *sbytes 안에 돌려주어집니다.

관련 항목
open(2), send(2), socket(2), writev(2)

역사
sendfile() (은)는, FreeBSD 3.0 그리고 처음 등장했습니다. 이 메뉴얼 페이지는 FreeBSD 3.1 그리고 처음 등장했습니다.

저자
sendfile() 곳의 메뉴얼 페이지는 David Greenman <dg@root.com> 하지만 작성했습니다.