Como saber se um arquivo especial de caractere seria bloqueado se lido

5

Gostaria de saber se um arquivo especial de caractere bloquearia se um caractere fosse lido sem realmente ler um caractere dele. Isso pode ser feito?

    
por Charles Stewart 15.06.2016 / 13:51

3 respostas

7

Você pode fazer isso a partir do bash usando um tempo limite 0 para read .

if read -t 0
then read data
fi

Para testar um descritor de arquivo diferente de stdin, digamos 3, use -u 3 . Para descobrir quantos caracteres estão prontos no stdin, você pode usar um pequeno script em perl:

#!/usr/bin/perl
require 'sys/ioctl.ph';
$size = pack("L", 0);
ioctl(*STDIN, FIONREAD(), $size) or die "ioctl fail: $!\n";
$size = unpack("L", $size);
print "stdin ready: $size\n";
    
por 15.06.2016 / 16:13
6

POSIX permite leituras não-bloqueantes de zero caracteres que "podem detectar e retornar erros", incluindo que a leitura bloquearia:

Se essa operação read verificar erros nesses casos, se uma leitura for bloqueada, read retornará -1 e definirá errno para EAGAIN (ou possivelmente EWOULDBLOCK para soquetes, mas você ' está perguntando sobre dispositivos de personagens).

    
por 15.06.2016 / 14:00
5

A partir de C ou C ++ você normalmente usaria pselect() para testar se há dados prontos para leitura. Você pode fazer isso sem ter que definir o modo do descritor de arquivo como não bloqueador.

    
por 15.06.2016 / 18:08