sistcomp 2014 tp pipes iii
TRANSCRIPT
-
Sistemas de Computadores
PipesLuis 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 Viamonte2
-
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 Viamonte3
-
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 Viamonte4
-
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 Viamonte5
-
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 Viamonte6
-
Pipe
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte7
-
Pipe
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte8
Processo 1 abcd Processo 2Fd[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 Viamonte9
-
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 Viamonte10
-
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 Viamonte11
Executa o comando sort fich.txt e permiteler 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 Viamonte12
-
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 Viamonte13
-
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 Viamonte14
-
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 Viamonte15
-
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 Viamonte16
-
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 Viamonte17
-
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 Viamonte18
-
Pipes
07/08
Sistemas de Computadores
Lus Lino Ferreira, Maria Joo Viamonte19
-
Exemploint 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 Viamonte20
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 Viamonte21
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 Viamonte22