[C] Memoria condivisa

Messaggioda giacomovicinanza » 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;
   
}
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 119 di 218
Iscritto il: 18/08/2021, 15:55

Re: [C] Memoria condivisa

Messaggioda apatriarca » 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.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5670 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Memoria condivisa

Messaggioda Quinzio » 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]);
Quinzio
Cannot live without
Cannot live without
 
Messaggio: 4898 di 10553
Iscritto il: 24/08/2010, 06:50

Re: [C] Memoria condivisa

Messaggioda giacomovicinanza » 14/05/2022, 09:46

Effettivamente avete ragione... Grazie mille per avermi aiutato
giacomovicinanza
Junior Member
Junior Member
 
Messaggio: 122 di 218
Iscritto il: 18/08/2021, 15:55


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite