Por exemplo, o arquivo poderia conter duas matrizes 3x3:
1 3 5 7 9 12 5 33 25 7 8 1 12 23 14 -4 4 -5
Caso alguma das matrizes não seja quadrada ou as duas não sejam do mesmo tamanho, o programa deve sinalizar um erro. O programa deve calcular o produto das duas matrizes lidas e imprimí-lo na tela em um formato razoável (por exemplo, o mesmo do arquivo de entrada).
A multiplicação deve ser executada, com concorrência, pelos processos auxiliares (também chamados de escravos.) Após ler o arquivo com as matrizes, o processo inicial (chamado de mestre) deve construir dois pipes e em seguida disparar N processos escravos (onde N é o segundo parâmetro do programa). A seguir, o processo mestre deve fechar um dos pipes para leitura e o outro para escrita; os processos escravos devem agir de forma simétrica.
Um dos pipes funcionará como um pool de tarefas, ou seja, o mestre colocará neste pipe uma descrição de cada tarefa a ser realizada. A descrição da tarefa consiste do par de inteiros que descreve uma posição da matriz. O outro pipe será usado para envio dos resultados calculados pelos processos escravos para o processo mestre. O mestre só deve imprimir o resultado quando tiver recebido todas as respostas.
Cada processo escravo deve continuamente processar tarefas do pool de tarefas, calculando o elemento indicado e enviando o resultado para o mestre, até que não existam tarefas a realizar.
A finalização do programa deve ser tratada.
A forma de detectar a finalização deve ser definida
por cada grupo (é desaconselhado o uso de kill
pelo processo mestre).
As chamadas necessárias para construção do programas
estão documentadas no próprio sistema, via man
, e em
Stevens.
Este livro está disponível para consulta na Biblioteca da Informática.