O FIFO ou outra coisa não bloqueia o acesso do escritor e, em vez disso, apenas descarta dados?

0

O FIFO é problemático em uso porque tanto o leitor quanto o escritor precisam abri-lo - se um deles estiver atrasado, o outro está bloqueado dentro do sistema operacional.

Eu tenho que implementar um mecanismo de publicação - um programa publica seus logs, e se alguém "se importa" de ouvir, ou seja, abre o canal de publicação, ele recebe as mensagens. Se ninguém "se importa", as mensagens desaparecem, sem problemas. Suporte para não mais do que um único ouvinte - também não há problema. O que posso usar?

    
por Digger 20.05.2018 / 14:56

1 resposta

1

Você pode transmitir o UDP. Esta é a parte do remetente , canalizar tudo para ela:

socat - UDP-DATAGRAM:127.255.255.255:50011,sourceport=50022,broadcast

Receptores usam isso, eles podem entrar ou sair da festa a qualquer momento:

socat - UDP-LISTEN:50011,bind=127.255.255.255,sourceport=50022,reuseaddr

Notas e explicações:

  • 50011 e 50022 são números de porta que você escolhe.
  • O endereço 127.255.255.255 significa que o remetente transmite através da interface de loopback, você pode ajustá-lo para transmitir na LAN, se desejar.
  • Da mesma forma, bind=127.255.255.255 deve limitar os receptores a essa interface, para que você não precise se preocupar com pacotes UDP (desonestos?) de outro lugar, se houver.
  • Um sourceport fixo por dois motivos:
    • receptores não "verão" outro remetente (desonesto?) que transmite para o mesmo endereço e porta, mas de outra porta de origem (talvez aleatória);
    • depois que o remetente é encerrado por qualquer motivo, você pode reiniciá-lo e todos os receptores existentes não verão a diferença; se o remetente usasse a porta de origem aleatória, os receptores existentes em geral não "veriam" o novo remetente porque ficariam fixos na porta de origem antiga.
  • reuseaddr permite que vários receptores coexistam.
  • Tecnicamente, você pode adicionar reuseaddr à parte do remetente, isso permite que você execute vários remetentes. Pode levar a saída intercalada no lado de recepção, não é recomendado.
  • Um remetente em execução impedirá que outro remetente (desonesto?) use exatamente a mesma tupla de endereços e portas. No entanto, assim que o remetente é terminado, outro pode tomar o seu lugar. Se você tiver acesso root, poderá escolher sourceport para ser menor que 1024 . A maioria dos sistemas operacionais não permite que usuários comuns se conectem a essas portas (o nome é "portas privilegiadas"); Dessa forma, os usuários não poderão representar seu remetente mesmo quando ele estiver morto. Receptores executados por usuários regulares, no entanto, podem usar uma porta privilegiada como sourceport . Para garantir que apenas o root possa receber, altere a outra porta ( 50011 no meu exemplo) para uma porta privilegiada.
por 25.05.2018 / 09:54

Tags