como o read (3) lida quando nbyte 0?

0

Não encontrei nenhum comportamento definido na página man para read (3). Meu palpite seria que ele ou lança um erro ou apenas retorna 0. Mas se alguém pudesse confirmar qualquer comportamento definido que seria ótimo. Ou se o comportamento é especificado como indefinido em algum lugar, então declarar que seria ótimo também.

    
por Justin 27.09.2018 / 01:09

2 respostas

2

Tal situação não pode acontecer por definição (pelo menos em POSIX.1-2008 e depois). O argumento nbyte para read() é um size_t e esse é um tipo inteiro sem sinal.

    
por 27.09.2018 / 01:30
1

Considere o protótipo da função read :

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

Como o argumento count é um size_t que não está assinado, se você tentar passar um número negativo, por exemplo. read(fd, buf, -20) (e você está executando uma máquina de complemento de 2 ;-)) que será interpretada como count muito grande, fora do intervalo de valores de retorno bem-sucedidos - read() retorna o número de bytes lidos como ssize_t , um inteiro assinado do mesmo tamanho que size_t .

Nesse caso, aplica-se o seguinte:

If the value of nbyte is greater than {SSIZE_MAX}, the result is
 implementation-defined.

Isso está no linux:

On  Linux,  read()  (and  similar  system  calls) will transfer at most
0x7ffff000 (2,147,479,552) bytes, returning the number of  bytes  actu-
ally transferred.  (This is true on both 32-bit and 64-bit systems.)

Na prática, um read() com count maior que SSIZE_MAX resulta em EFAULT , porque é impossível ajustar o bloco de memória começando em buf e estendendo-se por count bytes no arquivo acessível. parte do espaço de endereço.

Em * bsd:

read() and pread() may return the following error:

 [EINVAL]           nbytes was larger than SSIZE_MAX

E o mesmo em solaris:

EINVAL
           The nbyte argument overflowed an ssize_t.

Nota: o página de manual do openbsd menciona sistemas em que read () poderia retornar um valor negativo ao sucesso; Se você conhece esse sistema, por favor, adicione informações sobre isso aqui ou nos comentários.

    
por 27.09.2018 / 17:25

Tags