Created
November 19, 2014 23:14
-
-
Save bfb/de266184be9dd9177fc8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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