#include <iostream>
#include <csignal>
#include <cstdlib>
#include <ctime>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <unistd.h>
#include <cmath>
using namespace std;
int ID_procesa, l, m, n;
struct zajednickaMemorija {
int A[15][15];
int B[15][15];
int C[15][15];
}* memorija;
void izracunaj_redak(int indeksi[], int brpr) {
int umnozak = 0;
int pocetak = indeksi[0];
int kraj = indeksi[1];
for (int i = pocetak; i <= kraj; i++) {
for (int j = 0; j < l; j++) {
for (int k = 0; k < m; k++) {
umnozak += (memorija->A[i][k] * memorija->B[k][j]);
}
memorija->C[i][j] = umnozak;
umnozak = 0;
}
}
}
void brisi_memoriju(int sig) {
(void) shmdt(memorija);
(void) shmctl(ID_procesa, IPC_RMID, NULL);
exit(0);
}
int main(int argc, char* argv[]){
srand(time(NULL));
rand();
sigset(SIGINT, brisi_memoriju);
if(argc < 4){
cout << "Unesi tri parametra" << endl;
exit(1);
}
l = atoi(argv[1]);
m = atoi(argv[2]);
n = atoi(argv[3]);
ID_procesa = shmget(IPC_PRIVATE, (sizeof(int) * 2 * l * m), 0600);
memorija = (zajednickaMemorija* ) shmat(ID_procesa, NULL, 0);
for (int i = 0; i < l; i++) {
for (int j = 0; j < m; j++) {
memorija->A[i][j] = rand() % 10;
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < l; j++) {
memorija->B[i][j] = rand() % 10;
}
}
for (int i = 0; i < l; i++) {
for (int j = 0; j < l; j++) {
memorija->C[i][j] = 0;
}
}
cout << "Mnozenik = " << endl;
for (int i = 0; i < l; i++) {
for (int j = 0; j < m; j++) {
cout << memorija->A[i][j] << " ";
}
cout << endl;
}
cout << "Mnozitelj = " << endl;
for (int i = 0; i < m; i++) {
for (int j = 0; j < l; j++) {
cout << memorija->B[i][j] << " ";
}
cout << endl;
}
int raspored = ceil((float)l / n);
int pocetak = 0;
int kraj = raspored - 1;
cout << endl;
for(int i=0; i < n; i++){
int indeksi[] = {pocetak, kraj};
int stanjeProcesa = fork();
if(stanjeProcesa == 0){
izracunaj_redak(indeksi, i);
exit(0);
}
else if(stanjeProcesa == -1) {
cout << "Greska. Nije moguce stvoriti proces za gen. br.!" << endl;
brisi_memoriju(1);
}
pocetak = kraj + 1;
kraj += raspored;
if (kraj > l) kraj = l - 1;
if (pocetak > kraj) pocetak = kraj;
}
for(int i=0; i<n; i++)
wait(NULL);
cout << "Rezultat = " << endl;
for (int i = 0; i < l; i++) {
for (int j = 0; j < l; j++) {
cout << memorija->C[i][j] << " ";
}
cout << endl;
}
brisi_memoriju(0);
return 0;
};