SO1 – comunicação inter-processos em unix com named pipes (FIFOs)

[so1t]

#comunicação inter-processos em unix com named pipes (FIFOs)

bibliografia especifica:
Begining linux programming: mathew & stones, caps 10,11, e 12

#FIFOs/Named pipes:
é um mecanismo semelhante aos pipes anónimos mas com capacidade de identificação própria (visivel a processos independentes)
utilizam-se normalmente ficheiros
os pipes anónimos têm a desvantagem de não poderem ser utilizado por processos não relacionados entre si
isto acontece porque os identificadores de acesso às extremidades dos pipes são meros handles (índices na tabela de ficheiros abertos) e assim sendo:
os pipes anónimos só fazem sentido no contexto do processo que os criou (ou processos filhos)
os pipes anónimos que também fazem uso de ficheiros, não têm acesso à tabela de ficheiros abertos de outros processos independentes, sendo também o descritor de um pipe criado por um processo distinto e não relacionado não acessível

surgem assim os pipes não anónimos, com nome (ou FIFOs)
são pipes: com um mecanismo de comunicação similar aos pipes, mas existe um nome que por ser utilizado por processos não relacionados para a obtenção de acesso ao FIFO
são pipes: similar ao uso de um ficheiro, em que qualquer processo pode abrir/ler/escrever se souber o seu pathname ( e tiver permissões)

os FIFOs usam as funções de ficheiros:
open (ficheiro que já existe)
write (ficheiro previamente aberto)
read (ficheiro previamente aberto)
mkfifo (cria um FIFO)
unlink (remove um FIFO)
fcntl (manipula as propriedades do FIFO)

#a sincronização
pode ser realizada de duas formas: bloqueante (comportamento síncrono) e não bloqueante (comportamento assíncrono)

FIFO para leitura bloqueado
open(ficheiro, O_RDONLY);
_FIFO fica bloqueado até que alguém o abra para escrita
_o uso do read() com o FIFO vazio bloqueia o processo

FIFO para leitura não bloqueado
open(ficheiro, O_RDONLY | O_NONBLOCK);
_retorna de imediato
_o usod o read() com o FIFO vazio retorna 0

FIFO para escrita bloqueado
open(ficheiro, O_WRONLY);
_FIFO fica bloqueado até que alguém o abra para leitura
_o uso do write() com o FIFO cheio bloqueia até poder escrever todos os dados

FIFO para escrita não bloqueado
open(ficheiro, O_WRONLY | O_NONBLOCK);
_retorna de imediato
_o usod o write() tem que ter em conta o seguinte:
__ bytes a escrever <= PIPE_BUF -> falha
__ bytes a escrever > PIPE_BUF -> escreve o que ainda couber e retornar

#Exemplo de aplicação do FIFO – o dicionário (cliente – servidor)

no cliente:
quando faz um pedido ao servidor tem que enviar sempre o nome do pipe para o qual o servidor deve responder;
deve criar o seu pipe antes de fazer o pedido;
não deve abrir o seu pipe para leitura, pois o servidor ainda não abriu para escrita, nem o conhece;
deve abrir o seu pipe como não bloqueantes e deve logo de seguida alterar para bloqueante (uso do fcntl)

no servidor:
o servidor deve abrir o seu pipe sempre para leitura, mesmo quando todos os clientes sairem (técnica keep-alive)

algoritmo do cliente:
abre o FIFO do servidor para escrita
cria o FIFO para receber a resposta
abre o FIFO das respostas para leitura (como não bloqueante)
muda o FIFO para bloqueante com a função fcntl
repete durante uma certa condição
obtém palavra a traduzir
constrói pergunta = palavra + nome do FIFI para a resposta
fica à espera da resposta (efectua uma leitura no FIFO para a resposta)
fecha o FIFO do servidor
fecha o FIFO para as respostas
remove o FIFO das respostas

algoritmo do servidor:
cria o FIFO do servidor para obter as perguntas
repete durante uma certa condição
obtém a próxima pergunta (efectua leitura do FIFO do servidor)
obtém a tradução da palavra
obtém a identificação do FIFO para a resposta abre o FIFO do cliente que enviou a pergunta
envia a resposta(escreve no FIFO para a resposta)
fecha o FIFO para a resposta
fecha o FIFO do servidor
remove o FIFO do servidor

dict.h

 

 

Tags : , ,

0 thoughts on “SO1 – comunicação inter-processos em unix com named pipes (FIFOs)”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.