Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

[C] Memoria condivisa

13/05/2022, 17:18

Salve a tutti. Sto riscontrando un problema con questo esercizio praticamente non mi stampa i valori esatti ad ogni aggiornamento del codice da valori differenti. Non so se è un problema del compilatore. Grazie mille a chi mi aiuterà.


https://www.onlinegdb.com/fg6vItAXT -> il link del codice

Codice:
/*****************************************************************
Il candidato completi il programma fornito, implementando
il main. Il programma ottiene un numero intero N dai parametri
della linea di comando, e crea DUE processi figli.

Il primo processo figlio calcola la divisione intera di N
per 2 e lo comunica al processo padre; il secondo processo figlio calcola il resto
della divisione intera di N per 2 e lo comunica al processo padre.

La comunicazione tra processo padre e processi figlio deve avvenire
tramite un'area di memoria condivisa, dimensionata in modo da poter
contenere un array di due interi. Il primo processo figlio scrive
il suo risultato nel primo elemento dell'array, e il secondo processo
figlio scrive il suo risultato nel secondo elemento.

Il processo padre, DOPO aver creato TUTTI E DUE i processi figli,
aspetta che entrambi i processi figli completino la loro esecuzione;
a quel punto, il processo padre stampa i valori che ha ricevuto.

ESEMPIO
Specificando sulla linea di comando il parametro 11
l'output del programma sara':

Valori ottenuti dai processi figli: 1 5
******************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/wait.h>

int main(int argc, char *argv[]) {
    int figli[2];
   
    if(argc != 2) {
        printf("Non hai inserito il giusto numero di parametri\n");
        return -1;
    }
   
    int N = atoi(argv[1]);
   
    /* Crea l'area di memoria */
    int segment_id = shmget(IPC_PRIVATE, sizeof(int), S_IRUSR|S_IWUSR);
    if (segment_id<0) {
        printf("Errore in shmget\n");
        return -1;
    }
    int i;
    for(i=0; i<2; i++) {
       
        pid_t pid=fork();
       
        if (pid<0) {
            printf("Errore nella fork\n");
            /* Dealloco l'area */
            if (i==1) {
            /* C'è già un figlio, aspetto che termini prima di deallocare */
                wait(NULL);
            }
            shmctl(segment_id, IPC_RMID, NULL);
            return -1;
        } else if (pid==0) {
            /* Processo figlio */
            int * p= (int *)shmat(segment_id, NULL, 0);   //Per usare un'area di memoria condivsa, il processo deve collegarla al suo spazio di indirizzamento
           
            figli[0] = N/2;
            figli[1] = N%2;
     
      shmdt(p); // Quando un processo ha finito di usare un'area di memoria condivisa, deve scollegarla dal suo spazio di indirizzamento
            return 0;
        }
    }
        /* Processo Padre */
       /* Aspetto la terminazione dei figli */
    for(i=0; i<2; i++)
        wait(NULL);
       
    int *p=shmat(segment_id, NULL, 0);
    printf("I valori sono: %d %d\n", figli[0], figli[1]);
    /* Scollego l'area di memoria */
    shmdt(p);

    /* Dealloco l'area di memoria */
    shmctl(segment_id, IPC_RMID, NULL);

    return 0;
   
}

Re: [C] Memoria condivisa

14/05/2022, 00:51

Ho guardato il codice velocemente ma noto due errori:
1. La tua memoria condivisa ha una dimensione di sizeof(int) bytes ma dovrebbe contenere due interi e non uno solo. Manca una moltiplicazione per due...
2. Entrambi i tuoi processi figli fanno esattamente la stessa operazione, ma in base alla richiesta dell'esercizio il primo processo dovrebbe fare la divisione e il secondo calcolare il resto.

Re: [C] Memoria condivisa

14/05/2022, 09:30

Scusami Giacomo,
ma puoi spiegarmi perche' in un esercizio sulla memoria condivisa, allochi e ricavi un'area di memoria condivisa,
e poi non la usi ??
Per cosa hai allocato un pezzo di memoria se poi non la usi ?
L'array "figlio" e' una variabile allocata DENTRO al processo, quindi il processo padre ha il suo array "figlio" e i processi figli hanno i loro array "figlio" privati.
Ogni processo puo' usare solo le sue variabili e non puo' usare quelle di altri processi.
E' proprio per questo motivo che si deve ricorrere a un pezzo di memoria shared, ossia condivisa .

Inoltre ci sono anche le osservazioni giuste di apatriarca.

In pratica:

Devi modificare
Codice:
            figli[0] = N/2;
            figli[1] = N%2;

in
Codice:
         if (i == 0) p[0] = N / 2;
         if (i == 1) p[1] = N % 2;



e poi anche
Codice:
printf("I valori sono: %d %d\n", figli[0], figli[1]);

in
Codice:
printf("I valori sono: %d %d\n", p[0], p[1]);

Re: [C] Memoria condivisa

14/05/2022, 09:46

Effettivamente avete ragione... Grazie mille per avermi aiutato
Rispondi al messaggio


Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000— Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.