Programowanie współbieżne |
||
Pamięć dzielona
|
||
Wykonanie: Paweł Markiewicz |
Laboratorium nr 9 |
Data: 09.12.2021 |
Zadanie
1
Napisać program który tworzy w pamięci dzielonej
(posix) macierz kwadratową int *macA; o rozmiarze int
N=12; oraz wypełnia pola o współrzędnych x,y wartościami
x*y. Po wykonaniu operacji pamięć należy odłączyć. Do
wykorzystania są między innymi funkcje takie jak: shm_open,
ftruncate, mmap
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#define FLAGS O_RDWR | O_CREAT
int main (int argc, char **argv)
{
int fd, *macA = NULL, n = 12, length = n * n * sizeof(int), i, j;
if (-1 == (fd = shm_open("/shm_matrix", FLAGS, 0666)))
perror("blad shm_open");
if (-1 == (ftruncate(fd, length)))
perror("blad ftruncate");
if (MAP_FAILED == (macA = mmap(NULL,length,PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)))
perror("blad mmap");
for (i = 0; i < 12; i++)
for (j = 0; j < 12; j++)
macA[12 * i + j] = i * j;
close(fd);
exit(0);
}
Zadanie 2
Napisać drugi programik, który podłączy się do wcześniej utworzonej pamięci i wypisze dowolny fragment macierzy. Do tego celu stworzyć osobną funkcję której parametry odpowiednio to wskaźnik do początku pamięci macA rozmiar boku pamięci macA współrzędne początku podmacierzy oraz rozmiar podmacierzy. Formatowanie na 3 znakach w funkcji printf to %3d.
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#define FLAGS O_RDONLY
void show_matrix(int *macA, int msize, int x, int y, int size)
{
int i, j;
if (x + size > msize || y + size > msize)
return;
for (i = x; i < x + size; i++)
{
for (j = y; j < y + size; j++)
printf("[%3d] ", macA[msize * i + j]);
puts("");
}
}
int main (int argc, char **argv)
{
int fd, *macA = NULL, n = 12;
struct stat stat;
if (-1 == (fd = shm_open("/shm_matrix", FLAGS, 0666)))
perror("blad shm_open");
if (-1 == fstat(fd, &stat))
perror("blad fstat");
if (MAP_FAILED == (macA = mmap(NULL,stat.st_size,PROT_READ,MAP_SHARED, fd, 0)))
perror("blad mmap");
if (-1 == close(fd))
perror("blad mmap");
show_matrix(macA, 12, 0, 0, 12);
exit(0);
}