Skip to content

Instantly share code, notes, and snippets.

@bfb
Created November 19, 2014 23:14
Show Gist options
  • Save bfb/de266184be9dd9177fc8 to your computer and use it in GitHub Desktop.
Save bfb/de266184be9dd9177fc8 to your computer and use it in GitHub Desktop.
Nomes: Bruno F. Bohn, Cássio S. Ghilardi
1. DESCRIÇÃO DO PROBLEMA
O programa deverá ler caminhos de arquivos de um arquivo FIFO, e para cada arquivo deverá executar o comando `cat` para exibir o conteúdo na tela. Caso o arquivo esteja no format gzip, o programa deverá extrair o conteúdo utilizando o comando `gzip`.
2. REVISÃO CONCEITUAL
PIPE é um canal unidirecional de comunição entre processos. O PIPE é criado por um processo pai que utliza a chamada fork(). A chamada fork instancia um novo processo clone chamado de filho. E por fim, o PIPE é utlizado para a comunicação entre processo pai e filho.
FIFO, também chamado de PIPE renomeado, é um arquivo especial do tipo FIRST IN FIRST OUT. O objetivo do FIFO é permitir criar canais de comunicação entre processos não relacionados.
3. SOLUÇÃO
Um processo servidor é inicializado recebendo como parâmetro o caminho do arquivo FIFO desejado. Este processo é responsável por ler e tratar cada “mensagem” recebida através da FIFO e funciona através de um loop infinito, no qual aguarda a chegada das “mensagens” no arquivo FIFO. Quando uma “mensagem” é recebida, verifica-se se a mesma é um arquivo no formato gzip, caso sim, o programa precisa extrair o seu conteúdo, caso contrário é só abrir o arquivo e exibir na tela. Para a extração do arquivo, é utilizado o comando gzip, o procedimento para esta etapa é a seguinte. Processo server instancia um PIPE utilizando a chamada IO.pipe no qual retorna o descritor de leitura e o de escrita. O próximo passo é realizar o fork do processo, este é realizado através da chamada fork no qual retorna o pid do processo filho para o pai e nil para o filho.
O processo filho, originado a partir deste fork, utiliza o descritor de leitura do PIPE como o seu STDIN. Esse redirecionamento de descritores é realizado através do comando $stdin.reopen(rd), onde rd representa o descritor do PIPE.
No fluxo de execução, o processo pai abre o arquivo e escreve o seu conteúdo no descritor de escrita do PIPE, para então o processo filho receber o conteúdo e executar o comando gzip através da chamada exec exibindo o resultado na tela.
Por fim, o processo pai aguarda o filho terminar através do comando Process.wait para garantir a ordem dos caminhos de arquivos recebidos no arquivo FIFO. E retorna ao loop para aguardar as “mensagens” da FIFO.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment