JustPaste.it

#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;
};