FreeBSD/DragonFlyBSD sendfile() 시스템 호출은 어떻게 작동하나요?

FreeBSD/DragonFlyBSD sendfile() 시스템 호출은 어떻게 작동하나요?

파일 보내기()

매개변수 offset는 유형 off_t이고 nbytes유형이며 size_t둘 다 파일 길이라는 동일한 내용을 설명합니다. 내 파일이 보다 길지만 짧다면 off_t어떻게 되나요 size_t? 비동기식으로 보내면 현재 파일 오프셋이 더 커질 수 있지만 크기가 더 크기 off_t때문에 더 많이 보내고 싶습니다 .size_t

off_t서명된 경우와 size_t서명되지 않은 경우 모두 항상 낮춥니다.

설정할 수 있다는 것을 알고 있지만 nbytes = 0구체적으로 길이를 사용하고 싶습니다.

답변1

offset매개변수가 설명하는 것과는 다릅니다 nbytes. 대신, 파일에서 복사된 바이트가 시작되고 끝나는 위치를 각각 설명합니다.

파일 크기가 131,072바이트(128KiB)이고 offset16,384 및 nbytes32,768을 사용하는 경우 sendfile()파일의 위치 16,384에서 위치 49,152로 복사하여 위치 16,384에서 시작하여 총 32KiB( 에서 지정 nbytes) 를 복사합니다 offset.

offset114,688과 32,768을 사용하는 경우 위치 114,688에서 파일 끝 위치 131,072까지 총 16KiB를 복사 nbytes하게 됩니다 . sendfile()파일이 예상보다 짧기 때문에 nbytes요청한 sendfile()것보다 적은 양의 데이터가 전송됩니다.

offset147,456과 nbytes32,768을 사용 하면 sendfile()0바이트가 전송됩니다. 시작 부분이 파일 끝 부분을 지나면 복사할 바이트가 없으므로 아무 것도 보내지 않습니다.

마지막으로 0으로 설정된 특수한 경우가 있는데 nbytes, 이는 파일의 전체 내용을 복사하므로 offset0과 nbytes0을 사용하면 sendfile()전체 파일에 대해 총 131,072바이트(128KiB)가 전송됩니다.

관련 정보