Você está na página 1de 22

Sistemas de Computadores

Pipes
Luis Lino Ferreira, Luis Miguel Pinho, Orlando Sousa, Luis
Nogueira
Maro de 2014
Descritores de ficheiros
Cada processo pode manipular ao mesmo
tempo um certo nmero de ficheiros que
tenha aberto
A manipulao desses ficheiros faz-se no
pelo nome do ficheiro mas pelo descritor do
ficheiro
Este um inteiro que vai ser usado pelo
sistema operativo como ndice para uma
tabela onde est a informao de cada
ficheiro
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
2
Descritores de ficheiros
Quando um programa se inicia j esto
abertos os ficheiros correspondentes ao
standard input, standard output e standard
error
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
3
Descritores de ficheiros
Os descritores de ficheiros podem ser mudados
para realizarem operaes de comunicao
entre processos
Cada processo possui a sua tabela individual de
descritores de ficheiro
Os descritores de ficheiros so copiados
quando se faz um fork e (normalmente) so
preservados num exec
Desta forma um processo pode passar para
outros (gerados por si), descritores j prontos a
utilizar
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
4
Descritores de ficheiros
Um processo pode abrir o mesmo ficheiro
duas vezes, tendo como resultado dois
descritores diferentes
Se dois processos diferentes abrirem o
mesmo ficheiro, no h garantia que nos dois
processos, o mesmo ficheiro receba o
mesmo descritor
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
5
Pipes
Um pipe pode ser considerado um canal de
comunicao que liga dois processos e permite
um fluxo de informao unidireccional (half-
duplex)
Do ponto de vista do programador, o interface
usado igual aos ficheiros
Os descritores de um pipe so idnticos aos dos
ficheiros - as primitivas de leitura e escrita so os
habituais read e write
Um pipe um vector de inteiros de duas posies
Posio 0 - Leitura
Posio 1 - Escrita
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
6
Pipe
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
7
Pipe
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
8
Processo 1 abcd Processo 2
Fd[0]
Fd[1]
popen()
FILE *popen(const char *prog, const char
*modo)
Permite que um programa execute outro (*prog) sendo
possvel enviar ou receber dados desse programa
O modo pode ser r (leitura) ou w (escrita)
Se o modo for de leitura, o programa actual pode ler os
dados de sada do programa atravs do stdio.h
ex: fread, fscanf
Se o modo for de escrita, o programa pode enviar dados
para o programa invocado atravs das mesmas funes
ex: fwrite, fprintf
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
9
popen()
int pclose(FILE *apontador)
Fecha o ficheiro
int fread(void *ptr, size_t size,
size_t count, FILE * stream)
L um vetor com count elementos, cada um com
size de tamanho, do ficheiro stream e
armazena-o no buffer ptr.
Nota: o fwrite() similar
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
10
Exemplo popen
int d;
FILE *executa;
char buffer[81];
executa = popen("sort fich.txt", "r");
/* Enquanto existem dados para ler, l esses dados e imprime-os
no monitor */
while ((d = fread(buffer, sizeof(char), 80, executa))) {
buffer[d] = \0;
printf("%s", buffer);
}
pclose(executa); /* fecha o descritor */
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
11
Executa o comando sort fich.txt e permite
ler o seu resultado
O \0 serve apenas para indicar o fim da
string a ser impressa
Termina o ciclo quando fread retornar 0, i.e.
o pipe foi fechado.
Funes de Manipulao de pipes
int pipe(int fd[2])
Cria um pipe
Retorna
0 se criou o pipe com sucesso
- 1em caso de erro
Devolve dois descritores
um representa a extremidade de escrita - fd[1]
outro representa a extremidade de leitura - fd[0]
Para operaes de leitura ou escrita so
utilizadas as funes read e write
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
12
Funes de Manipulao de pipes
int dup(int descr)
duplica o canal de comunicao canal (um
descritor de ficheiros)
O sistema operativo percorre a tabela de
descritores de ficheiros procura de uma posio
livre. Quando a encontra, duplica, nessa posio,
o descritor de ficheiros descr, devolvendo a
posio encontrada
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
13
Funes de Manipulao de pipes
int dup2(int descr1, int descr2)
Associa ao descritor de ficheiros descr2 o mesmo
ficheiro que o descr1 referencia
int read(int descr, void *b, int
n_bytes)
L do ficheiro/pipe apontado por descr,
n_bytes, para o buffer b
Retorna o nmero de bytes lidos com sucesso

07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
14
Funes de Manipulao de pipes
int write(int descr, void *b, int
n_bytes)
Escreve no ficheiro/pipe apontado por descr,
n_bytes, do buffer b
Retorna o nmero de bytes escritos com sucesso
close(descr)
Fecha o ficheiro apontado por descr ( libertada
uma entrada da tabela de descritores de ficheiros)
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
15
Funcionamento de um pipe
pipe funciona como uma estrutura do tipo FIFO
Se for efectuada uma leitura (read), podem
acontecer duas situaes:
O pipe est vazio, originando o bloqueamento do
processo at que seja possvel efectuar o read
Ou o pipe no est vazio, sendo possvel efectuar o read.
Se forem lidos n bytes, ento os primeiros n bytes do pipe
so removidos
Ao contrrio dos ficheiros, os dados ao serem lidos,
desaparecem do pipe!
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
16
Funcionamente de um pipe
(cont.)
Ao ser efectuada uma escrita (write), podem
acontecer duas situaes:
Os dados no cabem no pipe, originando o
bloqueamento do processo de escrita, at que
seja feito um read do outro lado do pipe
Ou, os dados cabem no pipe e o write no
bloqueia
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
17
Pipes + Processos
Nos casos em queremos processos a
comunicar entre si, o pai deve criar o pipe
antes de criar os filhos, de modo a que o filho
herde os descritores do pai, para ter acesso
ao pipe
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
18
Pipes
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
19
Exemplo
int estado, dados[2];
pid_t pid;
char res[50], buffer[50] =
"Primeira experiencia com pipes";
pipe(dados);
pid = fork();
if (pid > 0) { //Pai
close(dados[0]);
write(dados[1], buffer,
sizeof(buffer) );
close(dados[1]);
wait(&estado);
} //fim Pai
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
20
else { //Filho
close(dados[1]);
read(dados[0], res, sizeof(res));
printf("O filho leu do pipe a
string: %s\n", res);
close(dados[0]);
}
return (0);
Exemplo com dup2
int dados[2], estado, d;
pid_t pid;
char buffer[81];
pipe(dados);
if ((pid = fork() == 0)) {
close(dados[0]);
dup2(dados[1], 1);
close(dados[1]);
execlp("sort", "sort",
"fich.txt", NULL);
}
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
21
else { /* PAI */
close(dados[1]);
while ((d = read(dados[0],
buffer, 80))) {
buffer[d] = \0;
printf("%s", buffer);
}
wait(&estado);
}
Duplica o descriptor de escrita para
o do pipe. I.e. qualquer printf vai
para ao stdout
Exerccio
Faa um programa que crie um processo e:
O processo pai envia o contedo do ficheiro
fich.txt ao processo filho
O processo filho l esses dados atravs de um
pipe e escreve o que recebeu no monitor
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte
22

Você também pode gostar