read()의 반환 값이 count 값을 초과할 수 있나요?

read()의 반환 값이 count 값을 초과할 수 있나요?

다음과 같은 함수 서명이 있습니다

ssize_t read(int fd, void *buf, size_t count);

매뉴얼 페이지를 기반으로 성공할 경우 반환 값이 다음보다 작을 수 있다는 것을 이해하지만계산, 그러나 반환 값은 다음을 초과할 수 있습니다.계산어쨌든?

답변1

부르다read()백그라운드에서 요청한 것보다 더 많은 데이터를 읽을 수 있습니다(예를 들어저장소에서 전체 블록을 읽거나 다음 블록을 먼저 읽습니다 read().안 돼요요청한 것보다 많은 데이터가 반환되었습니다( count). 그렇다면 buf일반적으로 바이트만 count크기가 조정되므로 결과는 버퍼 오버플로일 가능성이 높습니다.

POSIX(위 링크 참조)는 이 제한을 명시적으로 지정합니다.

성공적으로 완료한 후,바이트0보다 큼,읽다()업데이트된 파일의 마지막 데이터 액세스 타임스탬프가 스탬프되어야 하며 읽은 바이트 수가 반환되어야 합니다.이 숫자는 다음보다 클 수 없습니다.바이트.

리눅스 매뉴얼 페이지그다지 명확하지는 않지만 다음과 같이 말합니다.

read()읽어보세요에 따라계산바이트파일 설명자에서FD 다음으로 시작하는 버퍼를 입력하세요.완충기.

(강조가 추가되었습니다.)

답변2

오류가 발생하면 read()는 -1을 반환하며 부호 없는 것으로 처리되면 count보다 거의 확실하게 커집니다.

관련 정보