Pipes com Nome

 

Os pipes não têm um nome lógico para serem identificados pelo sistema, ou seja, os descritores são locais a um processo e apenas podem ser passados para os processos filho (só podem ser utilizados por processos relacionados hierarquicamente). Os pipes com nome comportam-se como ficheiros. São utilizados para troca de dados entre aplicações independentes (podem ser usados em aplicações Cliente/Servidor).

 

int mkfifo(const char *ficheiro, mode_t modo) - cria um pipe com nome.

int open(const char *caminho, O_RDONLY) - abre o pipe com nome para leitura. Bloqueia até que seja possível abria o pipe com nome.

int open(const char *caminho, O_RDONLY | O_NONBLOCK) - o mesmo que a função anterior, mas neste caso não bloqueia.

int open(const char *caminho, O_WRONLY) - abre o pipe com nome para escrita. Bloqueia até que seja possível abrir o pipe com nome.

int open(const char *caminho, O_WRONLY | O_NONBLOCK) - o mesmo que a função anterior mas neste caso não bloqueia.

 

Para ler e escrever no pipe com nome, são usadas as funções read e write.

 

 

Exemplo:

 

Para testar o exemplo abra duas janelas - uma para o servidor e outra para o cliente.

 

 

 

/* servidor.c - este programa fica ‘a espera que cheguem mensagens ao pipe com nome e escreve-as no ecran */

 

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

 

main()

{

int fich,f;

char dados[80];

 

fich=mkfifo("meupipe",0777); /* cria o pipe "meupipe" com as permissoes

de acesso - neste caso 755 (pois o valor 777 e’

alterado para 755 - ver umask - que normalmente e’

022)*/

f=open("meupipe",O_RDONLY); /* abre o pipe com nome */

for(;;)

{ /* quando tem alguma coisa no pipe com nome, le^ e escreve no

monitor*/

if (read(f,dados,81) >0 )

printf("%s\n",dados);

}

/* unlink("meupipe") - serve para remover o pipe com nome */

 

}

 

 

 

 

 

/* cliente.c - este programa envia para o pipe com nome uma string */

 

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

 

main()

{

int fich,f;

char dados[80];

strcpy(dados,"Experiencia - Pipes com Nome");

f=open("meupipe",O_WRONLY); /* abre o pipe para escrever ... */

write(f,dados,sizeof(dados));

}

 

 

Exercícios

1 - Faça o seguinte exercício:

 

2 - Faça o seguinte exercício:

Sugestão: utilize os pids dos clientes para resolver o problema. Apenas um pipe com nome é insuficiente para resolver o exercício.

 

3 - O mesmo que o exercício anterior, mas agora o servidor tem as seguintes características:

Sugestão: a resposta a um determinado pedido deve ser feita num novo processo.