Existe algum dispositivo especial que faça com que a leitura bloqueie para sempre?

1

Estou procurando uma variante de /dev/null que faça com que read seja bloqueado para sempre, em vez de retornar EOF imediatamente. Existe tal dispositivo?

Eu provavelmente poderia criar um pipe nomeado (via mkfifo ) para obter o efeito desejado, mas prefiro não ter que lidar com a desvinculação do FIFO no final do script.

Para o contexto, quero esperar que um servidor RPC seja encerrado. Para evitar polling, eu abro uma conexão via netcat:

netcat localhost 12345

A conexão será fechada automaticamente quando o servidor for fechado. Infelizmente, ao executar o comando via SSH, o stdin é definido como /dev/null e, portanto, o netcat sai imediatamente após o envio do EOF, em vez de esperar que a conexão seja fechada. netcat -d (não espere stdin) tem um bug? em macOS e spins hot, o que significa que a solução é realmente pior que a pesquisa em um intervalo razoável.

Eu tenho uma solução para esse problema - ligar o stdin a um cachimbo - mas estou especificamente interessado na questão, como afirmado por pura curiosidade.

    
por benesch 18.02.2018 / 20:07

1 resposta

0

Você pode criar um com cryptsetup (ou, eu acho, dmsetup também funciona).

# truncate -s 8M luksblock.img
# cryptsetup luksFormat luksblock.img
# cryptsetup luksOpen luksblock.img luksblock
# cryptsetup luksSuspend luksblock
# cat /dev/mapper/luksblock
( ... no output because it's blocked / suspended ... )

O que parece em dmsetup :

# dmsetup info luksblock
Name:              luksblock
State:             SUSPENDED
Read Ahead:        256
Tables present:    LIVE
Open count:        0
Event number:      0
Major, minor:      253, 71
Number of targets: 1
UUID: CRYPT-LUKS1-87bc6d9fd7fa419bbf15425c062d0916-luksblock

Você pode usar dmsetup para suspender um dispositivo:

dmsetup suspend luksblock

Portanto, deve ser possível criar um mapeamento de dispositivo suspenso que não precise ser apoiado por um arquivo luksblock.img em primeiro lugar, mas vou deixar esse bit final para você. :-P

É claro que essa abordagem tem uma grande desvantagem. Este dispositivo será listado entre todos os outros dispositivos de bloco em /proc/partitions , e tudo o que monitora ou detecta dispositivos (como o LVM em busca de novos volumes físicos) tentará ler e ficar preso no bloco também. Isso impedirá que os dispositivos sejam detectados (porque os processos estão parados) e a máquina pode não mais ser reinicializada (porque os processos de procedimentos de desligamento estão parados).

    
por 18.02.2018 / 20:18

Tags