SistComp 2014 TP Pipes III

Embed Size (px)

Citation preview

  • 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