Comunicação entre Processos


Informação complementar:

Esta aula tem por objetivo introduzir as operações básicas de comunicação entre processos em ambientes Linux. Para tal, deverá implementar pequenos programas que respondam aos requisitos de cada uma das tarefas que se seguem. Para obter mais informação sobre as funções de sistema referidas, consulte as man-pages respetivas.

  1. Enviar mensagens através de uma pipe: o programa deve criar um processo filho e enviar-lhe duas mensagens, "Hello world!" e "Goodbye!", terminando em seguida. Por sua vez, o processo filho deverá imprimir para o ecrã as mensagens à medida que as for recebendo, terminando assim que o processo pai feche a ligação. Não se esqueça de, em cada um dos processos, fechar os descritores que não vão ser usados. Desenhe a sua solução de modo a que o processo filho possa receber um número arbitrário de mensagens do processo pai (e não apenas as 2 mensagens indicadas acima).
    Funções a ter em conta: pipe(), write(), read() e close().
  2. Saída paginada: o programa deve criar um processo filho para paginar no ecrã as mensagens do processo pai. O processo pai deve enviar ao processo filho (recorrendo a uma pipe) a seguinte sequência de linhas:
        Linha 1
        Linha 2
        Linha 3
        ...
        Linha 99
        Linha 100
    O processo filho deve executar o programa more para paginar no ecrã a sequência de linhas recebida do processo pai. Como o paginador more precisa de ter acesso exclusivo ao terminal, o processo pai não deve terminar antes do processo filho. Note que o processo pai deverá fechar a terminação de escrita da pipe logo que termine de escrever todas as linhas, caso contrário o processo filho nunca terminará.
    Funções a ter em conta: pipe(), write(), dup2(), execlp() e close().
  3. Filtro de texto: o programa deverá ler as linhas de um ficheiro de texto e deverá guardar num novo ficheiro apenas as linhas que contenham uma dada palavra. O ficheiro origem, ficheiro destino e palavra para o filtro deverão ser passados ao programa como argumentos na linha de comando. Exemplo:
    $./filtro infile.txt outfile.txt filtro
    A execução do programa deverá contemplar dois processos (um processo pai e um processo filho). O processo pai deverá abrir o primeiro ficheiro (passado como argumento) e executar o comando cat que deverá ter como canal de entrada o ficheiro aberto. O processo filho deverá executar o comando grep para filtrar as linhas que contenham a palavra filtro. O output do processo filho deverá ser guardado no segundo ficheiro passado como argumento.
    Funções a ter em conta: pipe(), open(), dup2(), execlp() e close().