Criando um dispositivo semelhante a / dev / random a partir de um script

1

Estou escrevendo um programa para o qual vou criar um script para gerar dados de teste em um formato específico.

  1. Como posso criar um dispositivo /dev/myprogram que funcionaria de forma semelhante a /dev/random (de preferência no subdiretório de /dev/ , por exemplo: /dev/test/myprogram )?
  2. Posso anexar qualquer script a esse dispositivo ou preciso criar um programa em C usando algumas (ou?) APIs de baixo nível?
  3. Preciso devolver um byte de cada vez ou posso configurar o dispositivo para sempre retornar a quantidade especificada de bytes, maior que 1?

Estou usando o Ubuntu 14.04, embora eu esteja procurando uma resposta genérica que funcione em qualquer sistema * nix.

    
por syntagma 27.01.2015 / 23:32

2 respostas

2

Não é realmente possível criar um dispositivo sem a ajuda do kernel (escrevendo seu próprio módulo de driver do kernel); embora haja FUSE e menos conhecido e não comumente suportado CUSE para dispositivos de caractere no espaço do usuário, e NBD poderia ser usado para dispositivos de bloco.

Se for suficiente para ser semelhante, você pode usar pipes nomeados usando mkfifo e, em seguida, ter algum processo que grave dados "aleatórios" neste dispositivo, permitindo que outros processos leiam os mesmos dados de volta a partir dele. Você pode substituir /dev/random e /dev/urandom por um canal assim chamado e a maioria dos programas leria alegremente seus dados "aleatórios", já que poucos programas pensam em verificar se estão realmente falando com o dispositivo aleatório real. (até que o ioctl aleatório seja mais usado)

# mkfifo /dev/foobar
# while true; do dd if=/dev/urandom of=/dev/foobar; done &
# hexdump -C -n 16 /dev/foobar
00000000  ec ec 91 4b 9a 62 95 b0  95 7f 44 16 21 8d cd de  |...K.b....D.!...|
    
por 28.01.2015 / 00:32
0

(isso não é exatamente o que você pediu, mas ...) Às vezes, o $ RANDOM pode fazer o trabalho ...

Ex: gerar 20 dados

for a in {1..20}; do echo "$(($RANDOM % 6 + 1))"; done

Ou se preferir

declare -a A=(⚀  ⚁  ⚂  ⚃  ⚄  ⚅ )
for a in {1..20}; do echo ${A[$(($RANDOM % 6))]}; done
    
por 28.01.2015 / 00:22