Semáforos e memória partilhada


  1. Crie funções genéricas para a manipulação de um semáforo. As operações a implementar são: UP, DOWN, INI e END.
  2. Faça um programa que crie 5 processos e cada processo escreve 200 números:

    1º processo: 1 .. 200
    2º processo: 201 .. 400
    3º processo: 401 .. 600
    4º processo: 601 .. 800
    5º processo: 801 .. 1000

    O processo pai tem de esperar que todos os processos filho terminem. Note que o acesso ao ecrã é feito em simultâneo pelos 5 processos, podendo estar mais do que um processo a escrever os seus resultados. Utilize semáforos para permitir um acesso exclusivo ao ecrã.
  3. Crie um programa que implemente um produtor e um consumidor. O produtor gera um inteiro aleatório e coloca-o num ficheiro em disco. Cada vez que um novo valor é gerado o consumidor pode ler o ficheiro e mostrá-lo no ecrã. O produtor só pode guardar um novo valor no ficheiro se o que lá está já tiver sido lido pelo consumidor. O produtor e o consumidor deverão adormecer uma determinada quantidade de tempo entre cada operação (dada na linha de comandos). Use semáforos para coordenar o acesso à informação. Baseie-se no seguinte código para aceder ao ficheiro em disco.
            FILE *fptr; /* Declaração de apontador para ficheiro */
       
             /* Produtor */
             fptr = fopen("ficheiro","w"); /* abertura do ficheiro para escrita */
             fprintf(fptr,"%d",num); /* escrita da variável num */
             fclose(fptr); /* fechar ficheiro */

            /* Consumidor */
             fptr = fopen("ficheiro","r"); /* abertura do ficheiro para leitura */
             fscanf(fptr,"%d",&num); /* leitura da variável num */
             fclose(fptr); /* fechar ficheiro */

            Experimente usar diversos consumidores. Altere a velocidade de produção / consumo e observe os resultados.

[Resolução]

  1. Crie um programa que crie um filho. O processo pai deve colocar uma string em maiúsculas numa zona de memória partilhada. O processo filho deve ler a string, convertê-la para minúsculas e voltar a colocá-la na zona de memória partilhada.
  2. Modifique o programa criado no exercício 3 de forma a usar memória partilhada em vez do ficheiro.
  3. Crie um programa que reserve um espaço de memória partilhada suficiente para 6 frases de até 50 caracteres. Este programa deve criar processos para executar outros dois programas. Um para produzir frases e colocá-las na memória e outro para ler as frases e mostrá-las no ecrã. Deve também aceitar dois argumentos na linha de comandos com o tempo máximo que um ciclo de produção ou consumo de uma frase pode durar (usando sleep). Quando um dos processos filho terminar o programa deverá enviar um SIGKILL ao outro. Note que deverá usar semáforos para aceder de forma exclusiva à memória. Altere os tempos de forma a tornar o produtor mais rápido que o consumidor e vice-versa. Observe os resultados.
    [Resolução]

Complementos de Programação - ISEP 2003
HTML Válido