![nbyte < 0일 때 read(3)는 어떻게 처리합니까?](https://linux55.com/image/11613/nbyte%20%26lt%3B%200%EC%9D%BC%20%EB%95%8C%20read(3)%EB%8A%94%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%B2%98%EB%A6%AC%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
read(3)에 대한 매뉴얼 페이지에서 정의된 동작을 찾을 수 없습니다. 내 생각엔 오류가 발생하거나 0을 반환하는 것 같습니다. 그러나 누군가 정의된 동작을 확인할 수 있다면 좋을 것입니다. 또는 동작이 어딘가에 정의되지 않은 것으로 지정되어 있는 경우에도 이를 명시하는 것이 좋을 것입니다.
답변1
정의에 따르면 이런 일은 일어날 수 없습니다(적어도POSIX.1-2008그 다음에). nbyte
매개변수 는 부호 없는 정수 유형인 read()
a 입니다.size_t
답변2
함수의 프로토타입을 생각해 보세요 read
.
ssize_t read(int fd, void *buf, size_t count);
count
인수가 부호가 없으므로 size_t
음수를 전달하려고 하면 다음과 같습니다. read(fd, buf, -20)
(그리고 2의 보수 기계를 실행하고 있습니다 ;-)) 이는 성공 반환 값의 범위를 넘어서 매우 큰 것으로 해석됩니다 . 이는 count
a로 읽은 read()
바이트 수를 반환합니다.ssize_t
징후동일한 크기의 정수입니다 size_t
.
이 경우 다음 조항이 적용됩니다.
nbyte 값이 보다 크면
{SSIZE_MAX}
결과는 구현에 따라 정의됩니다.
이 시간은운영 체제:
Linux에서는
read()
(및 유사한 시스템 호출) 최대0x7ffff000
(2,147,479,552
) 바이트를 전송하여 전송된 실제 바이트 수를 반환합니다. (32비트 시스템과 64비트 시스템 모두에 해당됩니다.)
실제로, 프로세스의 주소 공간 내에서 바이트에서 시작하여 바이트 단위로 확장되는 메모리 블록을 맞추는 것이 불가능하기 때문에 read()
보다 큰 경우가 생성 count
됩니다 .SSIZE_MAX
EFAULT
buf
count
*bsd에서:
read()
pread()
다음 오류가 반환될 수 있습니다 .
[EINVAL]
n바이트보다 큼SSIZE_MAX
솔라리스에서도 마찬가지입니다:
EINVAL
nbyte 매개변수가 오버플로되었습니다
ssize_t
.
참고: openbsd맨페이지성공 시 음수 값을 반환할 수 있는 시스템을 언급하세요 read()
. 그러한 시스템을 알고 있다면 여기 또는 댓글에 이에 대한 정보를 추가해 주세요.