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.