Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Mecanismos de comunicao
FSO
FSO
FSO
FSO
Redireco do STDOUT
FSO
Redireco do STDOUT
FSO
11
Sincronizao
Sincronizao:
AGUARDAR/ASSINALAR
TRANSFERIR INFORMAO
FSO
13
FSO
Pipes no Unix
Mecanismo
15
FSO
FSO
Tabelas em memria
Procs.
c/canais abertos
p1
Fich. abertos
Offset R
blocos
Offset RW
Offset R
p2
Offset R
Offset R
Buffers
/ Disco
p3
canais de cada
processo
Tabela global de
fich. abertos
FSO
FSO
int p[2];
if (pipe(p) == -1) { erro}
write(p[1], buf1, buf1size);
write(p[1], buf2, buf2size);
. . .
read(p[0], buf, n);
. . .
FSO
20
FSO
os pipes no tm um pathname
que aparea na listagem de ficheiros de
uma directoria, no so conhecidos por
todos os processos
Os
if (pipe(p)==-1) abort();
switch(fork())
{ case -1: abort();
case 0: // filho
read(p[0], bufin, n);
...
default: // pai
write(p[1],"ola",3); ...
}
FSO
23
pipe
desc. canais
filho
p[0]
p[1]
FSO
24
p[0]
pai
FIFO
p[1]
escritor
filho
p[1]
25
Exemplo
Escritor envia:
close(p[0]);
write(p[1],);
Leitor recebe:
close(p[1]);
read(p[0],);
;
FSO
26
FSO
FSO
Funcionamento do pipe
Um
29
Ler de um pipe
read(fd[0], buf, count)
bloqueia o processo que a invoca
(leitor), se o buffer do pipe est vazio
devolve os bytes que puder ler, mesmo
se forem menos dos que os pedidos:
n = read(fd[0], buf, count)
FSO
30
31
Funcionamento do pipe
Como
32
FSO
Um pipeline de processos
FSO
43
FSO
Ligar um canal a
um lado de um pipe
FSO
FSO
Ligar um canal a
um lado de um pipe
?
Um pipe no tem nome
Ento no posso fazer
fd = open(nome,)
para abrir um canal para um pipe
FSO
FSO
Exemplo:
Exemplo
FSO
Copiando descritores
Obter
FSO
fd = dup2( old-fd, 1 );
fecha a entrada 1 (STDOUT) e coloca nessa
entrada uma cpia da entrada old-fd: as
entradas 1 e old-fd passam a ter dois canais
abertos para o mesmo ficheiro
FSO
Um pipeline de processos
FSO
Contar
56
Programando: ls /bin | wc l
o
Programando: ls /bin | wc l
if (pipe(p)==-1) abort();
switch(fork())
{ case -1: abort();
case 0: filho1(p);
exit(1);
default:
switch(fork())
{
case -1: abort();
case 0: filho2(p);
exit(1);
default:
}
close(p[0]);
close(p[1]);
wait(NULL);
wait(NULL);
}
58
filho1 | filho2
pai
p[1]
p[0]
p[1]
filho1
p[0]
filho2
p[1]
p[0]
FSO
59
FSO
FSO
FSO