2011-12-24 2 views
6

sendfile()은 컴퓨터 A에서 컴퓨터 B로 데이터를 가져 오기 위해 "파일"설명자에서 "소켓"설명자로 데이터를 전송하는 데 사용할 수 있습니다. "socket"디스크립터에서 비슷한 zero-copy 의미론을 가진 파일에 대한 수신 끝? 나는 sendfile()이 도움이되지 않는다고 생각한다. 왜냐하면 sendfile()은 "페이지/버퍼"캐시가 될 데이터 소스를 필요로하기 때문이다. 내 이해가 맞습니까? 이 상황에서 splice() 도움이 될 수 있습니까?sendfile() 및 splice()에 대한 이해

답변

11

이 경우 sendfile의 제한 사항에 대해 정확합니다. 예, splice도 도움이 될 수 있지만 사소하지는 않습니다. splice은 소스 또는 대상 파일 설명자 중 적어도 하나가 파이프 여야합니다. 따라서 소켓에서 일반 파일 설명자로 직접 splice을 보낼 수는 없습니다.

개념적으로, 당신이 그것을 작동하게 할 수있는 것입니다 :

  • 설정은 인바운드 소켓 FD와 출력 파일 FD 일반적
  • 루프에서 pipe(2)
  • 와 파이프를 만드는 것처럼 : 파이프의 판독 측으로부터 splice
  • 쓰기와 파이프의 기록 측의 소켓에서
    • 판독 토륨 또한 splice

를 반복하여 모든 데이터를 읽을 때까지 마지막 단계에와 전자 파일.

Zero-Copy in Linux with sendfile() and splice()에는이 기술이 구현되어 있습니다.

+3

2.6.33 이후 sendfile의 out_fd는 소켓뿐만 아니라 모든 파일 설명자가 될 수 있습니다. – ldrg

+1

4.2 이후로는'splice()'와 동일합니다. – technosaurus