DEV Community 👩‍💻👨‍💻

Cover image for Implementando um simples background job com UNIX named pipes
Leandro Proença
Leandro Proença

Posted on

Implementando um simples background job com UNIX named pipes

No último artigo vimos o funcionamento de UNIX streams, pipes e mais precisamente, anonymous pipes. E que estes canais são uma das bases de comunicação entre diferentes processos.

Neste artigo vamos explorar "pipes nomeados", ou named pipes, e como este modelo de dados pode ajudar a entender o funcionamento de um background job.

Anonymous pipes são FIFO

FIFO remete a "First in, first out", que significa

Primeiro a entrar, primeiro a sair

Parece com filas né? Mas entretanto...

São unidirecionais

...pois caminham apenas em um sentido, e nunca de forma "bidirecional":

### ----> going this way ---->
$ echo 'my precious' | md5 | base64
Enter fullscreen mode Exit fullscreen mode

Para que sejam bidirecionais, seria preciso que um processo enviasse mensagem de volta para o outro.

E há uma solução para isto.

Named pipes

Com o comando mkfifo, podemos criar uma pipe nomeada e usá-la entre diferentes comandos para comunicação através dos streams.

Para criar comunicação bidirecional, teríamos que criar duas FIFO, mas para nosso simples exemplo, vamos manter unidirecional com apenas uma FIFO.

Esta pipe poderá servir como uma fila FIFO:

$ mkfifo myqueue
$ ls -la myqueue
Enter fullscreen mode Exit fullscreen mode
prw-r--r--  1 leandronsp  staff     0B Jun 14 23:09 myqueue
Enter fullscreen mode Exit fullscreen mode

Utilizando o pipe

Podemos jogar saídas de comandos para dentro do pipe, por exemplo com este processo "escritor":

$ echo 'my precious' | base64 > myqueue
Enter fullscreen mode Exit fullscreen mode

O processo fica bloqueado à espera que algum outro processo "leitor" leia da fila. Em outra janela:

$ cat myqueue
Enter fullscreen mode Exit fullscreen mode
bXkgcHJlY2lvdXMK
Enter fullscreen mode Exit fullscreen mode

O inverso também pode acontecer, onde começamos pelo leitor:

$ cat myqueue
Enter fullscreen mode Exit fullscreen mode

Que fica bloqueado à espera de "mensagens na fila". E assim outro processo escritor pode enviar a mensagem:

echo 'my precious' | base64 > myqueue
Enter fullscreen mode Exit fullscreen mode

Janela do leitor:

bXkgcHJlY2lvdXMK
Enter fullscreen mode Exit fullscreen mode

Processamento assíncrono

Esta funcionalidade básica abre portas para o processamento assíncrono de mensagens, onde podemos ter um "worker" que fica infinitamente à espera de mensagens no pipe, ao passo que diferentes "publicadores" colocam mensagens no pipe de forma assíncrona.

Estamos falando de background jobs.

Criando um worker que decodifica base64

Vamos então criar um worker simples em Shell script que recebe uma mensagem codificada em base64, decodifica, mostra-a no screen (STDOUT) e volta para o loop à espera de mais mensagens no pipe:
sidequack.sh

#!/bin/bash
## Cria o named pipe
mkfifo myqueue

echo "Waiting for jobs in the queue..."

## Loop infinito
while true
do
  ## Bloqueia à espera de mensagem no pipe
  ENCODED=`cat myqueue`

  ## Nova mensagem chegou no pipe...
  echo "Going to perform Job..."
  echo "Encoded: $ENCODED | Decoded: `echo $ENCODED | base64 -d`"
done
Enter fullscreen mode Exit fullscreen mode
bash sidequack.sh
Enter fullscreen mode Exit fullscreen mode
Waiting for jobs in the queue...
Enter fullscreen mode Exit fullscreen mode

Agora, em outra janela, podemos colocar no pipe diferentes "jobs" a serem processados:

echo 'my precious' | base64 > myqueue
echo 'pipes are awesome' | base64 > myqueue
Enter fullscreen mode Exit fullscreen mode

Podemos consultar no terminal do worker:

Going to perform Job...                                       
Encoded: bXkgcHJlY2lvdXMK | Decoded: my precious

Going to perform Job...                                       
Encoded: cGlwZXMgYXJlIGF3ZXNvbWUK | Decoded: pipes are awesome
Enter fullscreen mode Exit fullscreen mode

Conclusão

Este artigo foi uma tentativa de mostrar o funcionamento de UNIX named pipes e como podem ser usados para comunicação entre diferentes processos através de estruturas FIFO, com a demonstração da implementação de um simples background job.

Top comments (0)

🌚 Life is too short to browse without dark mode