Buffering (named) pipe no GNU OS

5

No sistema operacional GNU, um processo só pode gravar dados em um canal se outro processo ler os mesmos dados (do mesmo canal) ao mesmo tempo.

Existe algo como um pipe que permite ao primeiro processo escrever e armazenar os dados até que o segundo o leia?

    
por Al Klimov 26.10.2014 / 11:15

3 respostas

2

Como ninguém poderia me mostrar um aplicativo que atenda às minhas necessidades, escrevi meu próprio .

    
por 05.12.2014 / 20:38
3

Um pipe nomeado (fifo) pode fazer o que você quiser até certo ponto, mas com algumas ressalvas:

  1. Se você quiser gravar no pipe antes que o leitor exista, seu gravador deve abrir o fifo como read-write ou a chamada para open será bloqueada. No shell isso pode ser assim:

    exec 3<>/path/to/pipe
    echo "foo" >&3
    cat <&3
    

    Como você pode ver, eu posso escrever no pipe antes que o leitor esteja por perto. Depois de ler o canal, as mensagens que escrevi já estão lá.

  2. As gravações no pipe serão eventualmente bloqueadas quando o cano for preenchido. De acordo com o canal (7) no linux:

A pipe has a limited capacity. If the pipe is full, then a write(2) will block or fail, depending on whether the O_NONBLOCK flag is set (see below). Different implementations have different limits for the pipe capacity. Applications should not rely on a particular capacity: an application should be designed so that a reading process consumes data as soon as it is available, so that a writing process does not remain blocked.

In Linux versions before 2.6.11, the capacity of a pipe was the same as the system page size (e.g., 4096 bytes on i386). Since Linux 2.6.11, the pipe capacity is 65536 bytes.

Dependendo do seu caso de uso, você também pode considerar o uso de uma fila de mensagens. O kernel fornece uma fila de mensagens. No Linux, veja mq_overview (7) para uma boa visão geral. Como alternativa, serviços como o RabbitMQ fornecem filas de mensagens com uma variedade de conjuntos de recursos, incluindo o uso em uma rede.

    
por 26.10.2014 / 11:58
-2

Você quer dizer link ? Funciona como você pede.

    
por 26.10.2014 / 11:40