LAB 2 - Programa modelo para criar variável na memória

Transcrição

LAB 2 - Programa modelo para criar variável na memória
LAB 2 - Programa modelo para criar variável na memória compartilhada e verificar o seu
funcionamento.
#include <sys/shm.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/wait.h>
int main (int argc, char *argv[])
{
int segmento, *p, id, pid, status;
// aloca a memória compartilhada
segmento = shmget (IPC_PRIVATE, sizeof (int), IPC_CREAT | IPC_EXCL | S_IRUSR |
S_IWUSR);
// associa a memória compartilhada ao processo
p = (int *) shmat (segmento, 0, 0);
// comparar o retorno com -1
*p = 8752;
if ((id = fork()) < 0)
{
puts ("Erro na criação do novo processo");
exit (-2);
}
else if (id == 0)
{
*p += 5;
printf ("Processo filho = %d\n", *p);
}
else
{
pid = wait (&status);
*p += 10;
printf ("Processo pai = %d\n", *p);
}
// libera a memória compartilhada do processo
shmdt (p);
// libera a memória compartilhada
shmctl (segmento, IPC_RMID, 0);
return 0;
}
Resultado:
Conclusão:
Realmente, a variável P foi inicializada com valor igual a 8752, o processo filho adicionou o valor
5 à variável exibindo o valor 8757 e o pai adicionou o valor 10 à variável exibindo o valor 8767,
indicando que os processos incrementaram a mesma posição de memória.
Exercícios para o lab:
1) Acesso à memória com ponteiro
Faça um programa que inicialize uma variável com um valor e que inicialize um
ponteiro para a variável inicializada.
Duplique o processo via fork() e altere o valor da variável usando o ponteiro.
Ocorreu Segmentation Fault? Explique.
2) Mensagem do dia
Faça um programa que:
a. Leia do teclado uma mensagem do dia
b. Crie uma memória compartilhada com uma chave determinada (por exemplo:
ID = 8752)
c. Salve a mensagem na memória compartilhada
Faça um outro programa que utilize a mesma chave (ID = 8752) e exiba a mensagem
do dia para o usuário.
3) Soma de matrizes
Faça um programa para somar matrizes de acordo com o seguinte algoritmo
a. O primeiro processo irá criar duas matrizes inicializadas e uma terceira vazia
em áreas da memória compartilhada.
b. Para cada linha da matriz solução, o seu programa deverá gerar um processo
para o seu cálculo (use uma matriz 3 x 3).
c. O primeiro processo irá imprimir a matriz resultante.
4) Busca paralela em vetor
Faça um programa paralelo para localizar uma chave em um vetor, por exemplo, com
100 posições.
a. Crie uma memória compartilhada para armazenar o vetor, com dados
desordenados, e a divida pelo número de processos (por exemplo: 10
processos)
b. Cada processo deve procurar o dado na sua área de memória e informar a
posição onde o dado foi localizado. Por exemplo, o primeiro processo procura
o dado na posição 1 a 9, o segundo na 10 a 19, etc.