Introdução à semáforos (produtor e consumidor)
SISTEMAS OPERACIONAIS A
LABORATÓRIO
Experimento 03
Introdução No experimento anterior, vimos que o recurso de fila de mensagens nos permite a comunicação entre processos e compartilhamento de dados entre eles. No experimento 3, vamos ver outro mecanismo de IPC, o semáforo, que nos ajuda com problemas de acesso simultâneo a uma mesma área de memória, sendo este garantia de sincronismo se usado corretamente. Vamos trabalhar em todo o experimento em cima do conceito de exclusão mútua, analisando sempre o comportamento dos semáforos (produtor e consumidor).
Erros de Sintaxe e Lógica do Programa Exemplo
Erro 1: Falta a declaração da biblioteca necessária para a execução do exit().
Solução: #include Erro 2: Ao final da criação dos filhos está declarado exit após o else, deve ser break.
Solução: .. else { exit } para { break;}
Erro 3: Tem declarado um kill() a mais, está matando 5 filhos, sendo que só tenho 4 declarados.
Solução: Exclusão do kill (pid[4], SIGKILL);
Erro 4: Erro na declaração da permissão ao criar memória compartilhada.
Solução: if( (g_shm_id = shmget( SHM_KEY, sizeof(int), IPC_CREAT | 0000)) == -1 ) { para if( (g_shm_id = shmget( SHM_KEY, sizeof(int), IPC_CREAT | 0666)) == -1 ) {
Erro 5: Alteração do valor de chave da memória compartilhada.
Solução: #define SHM_KEY 0x1432 para #define SHM_KEY 0x5678
Erro 6: Erro no tipo declarado para impressão do vetor de caracteres no fprintf deve-se trocar por “%c”.
Solução: fprintf(stderr,"%f7", g_letters_and_numbers[tmp_index + i]); para fprintf(stderr,"%c", g_letters_and_numbers[tmp_index + i]);
Erro 7: Para a primeira execução pedida, é necessário retirar os sinais de comentário da declaração de proteção.
Solução: /*#define PROTECT; */ para #define PROTECT;
Erro 8: As estruturas dos semáforos (produtor e consumidor) estão declaradas com o mesmo nome, é necessário renomear uma das estruturas para g_sem_op2[]...