문제

전주곡

sendfile() 두 가지 이유로 매우 유용한 SyScall입니다.

먼저, 그것은입니다 적은 코드 A보다 read()/write() (또는 recv()/send() 그 jive) 루프를 선호한다면.
둘째, 그것은입니다 더 빠르게 (SYSCALLS가 적고 구현은 장치간에 복사 할 수 있습니다 없이 버퍼 등 ...) 위에서 언급 한 방법보다.

적은 코드. 더 효율적입니다. 대박.

유닉스에서는 모든 것이 (대부분) 파일입니다. 이것은 플라톤 이론과 실제 관행의 충돌로 인한 추악한 영토입니다. 소켓은 일부 장치에 상주하는 파일과 근본적으로 다르다는 것을 알고 있습니다. 나는 Linux/*BSD/Darwin/OS 구현의 출처를 파악하지 못했습니다. sendfile() 이 특정 SyScall이 소켓 (특히 스트리밍 소켓)에 쓰기로 제한되는 이유를 알기 위해.

난 그냥 알고 싶어 ...

의문

제한 사항 sendfile() 대상 파일 디스크립터가 소켓 (디스크 파일 또는 파이프와 같은) 외에 무언가가되도록 허용하는 것입니까?

도움이 되었습니까?

해결책

기본적으로, 그것을 제한하는 유일한 것은 "아무도 코드를 작성하지 않았다"는 것입니다.

그러나 나는 당신이 언급 한 두 가지 사례에 대해 No-one이 코드를 작성한 이유는 둘 다 데이터를 복사해야한다는 것입니다. sendfile 처음에.

  • 파일 투 파일의 경우 sendfile, 그렇지 않으면 동일한 페이지가 소스 파일의 깨끗한 페이지와 대상 파일의 더러운 페이지와 같은 PageCache에 있어야하므로 사본이 필요합니다. 나는 Pagecache가 현재 그 사건을 처리하도록 만들어 졌다고 생각하지 않습니다 (물론 충분한 동기가 있으면 변경 될 수 있습니다).

  • 파일-파이프 용 sendfile, 대상 프로세스는 개인의 쓰기 가능한 데이터 사본을 가져와야하므로 사본이 필요합니다. 어쨌든,이 사건의 대부분의 용도에 대해 우리는 이미 mmap.

다른 팁

초기 Linux 2.6에서 도입 된 제한이라는 것을 기억하는 것 같습니다 (2.4에는 제한이 없었습니다).

2.6.17 이후 Linux에는 Splice () 시스템 호출이 유사합니다. 더 유연하지만 약간 덜 효율적입니다. Linus는 Splice ()의 측면에서 SendFile을 다시 구현하는 것에 대해 이야기했습니다. 보다 http://kerneltrap.org/node/6505

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top