다음과 같은 함수 서명이 있습니다
ssize_t read(int fd, void *buf, size_t count);
매뉴얼 페이지를 기반으로 성공할 경우 반환 값이 다음보다 작을 수 있다는 것을 이해하지만계산, 그러나 반환 값은 다음을 초과할 수 있습니다.계산어쨌든?
답변1
부르다read()
백그라운드에서 요청한 것보다 더 많은 데이터를 읽을 수 있습니다(예를 들어저장소에서 전체 블록을 읽거나 다음 블록을 먼저 읽습니다 read()
.안 돼요요청한 것보다 많은 데이터가 반환되었습니다( count
). 그렇다면 buf
일반적으로 바이트만 count
크기가 조정되므로 결과는 버퍼 오버플로일 가능성이 높습니다.
POSIX(위 링크 참조)는 이 제한을 명시적으로 지정합니다.
성공적으로 완료한 후,바이트0보다 큼,읽다()업데이트된 파일의 마지막 데이터 액세스 타임스탬프가 스탬프되어야 하며 읽은 바이트 수가 반환되어야 합니다.이 숫자는 다음보다 클 수 없습니다.바이트.
리눅스 매뉴얼 페이지그다지 명확하지는 않지만 다음과 같이 말합니다.
read()
읽어보세요에 따라계산바이트파일 설명자에서FD 다음으로 시작하는 버퍼를 입력하세요.완충기.
(강조가 추가되었습니다.)
답변2
오류가 발생하면 read()는 -1을 반환하며 부호 없는 것으로 처리되면 count보다 거의 확실하게 커집니다.