Semáforos e memória partilhada
- 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.
- 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ã.
- 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]
- 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.
- Modifique o programa criado no exercício 3 de forma a usar
memória partilhada em vez do ficheiro.
- 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