Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    [c] problema memoria condivisa

    ciao a tutti,
    una volta ottenuto il pnt al primo elemento delle memoria condivisa come si accede alla mem condivisa da altri processi figli? mi è sembrato di capire che i puntatori non posso
    condividerli fra processo padre e proc figlio, eppure mi sembrava l'unico modo giusto per accedere alla memoria
    condivisa dai processi figli...ho fatto questo programma, chi saprebbe farmelo funzionare?

    codice:
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <signal.h>
    #include <stdlib.h>
    #include <time.h>
    
    #include <sys/ipc.h>
    #include <sys/shm.h>
    
    #define SHMEM_KEY 1950 
    
    
    void parser(int argc,char *argv[]);
    main(int argc, char *argv[])
    {
    
    //creo la shmem e faccio l'attach
    int shm_descr = shmget(SHMEM_KEY, sizeof(int) * 15, IPC_CREAT | 0600);
    int *msg = shmat(shm_descr, NULL, SHM_R | SHM_W);
    
    //puntatori a inizio e fine shmem
    int *msg_inizio = msg;
    int *msg_fine = msg + 14;
    
    //creo i clienti con delle fork
    int i,x, num_rich;
    for(i=0;i<5;i++){
    
     x=fork();
     if(!x) {
        break;
     }
    }
    
    //esecuzione dei processi figli
    if(!x)
    {
      int i;  
    
        //costruzione degli elementi del msg da inserire
        int pid = getpid();
        
        *msg = pid;
        printf("richiesta inserita: %d, numero memoria: %d\n", *msg, msg);
        msg++;   
        //*msg++ = m;
       
    }
    }
    per vedere cosa c'è nella m.c:

    codice:
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/types.h>
    
    #include <stdlib.h>
    #include <stdio.h>
    
    #define SHMEM_KEY 1950 
    
    main(){
    int shm_descr = shmget(SHMEM_KEY, sizeof(int) * 15, 0);
    int *msg = shmat(shm_descr, NULL, SHM_R | SHM_W);
    int i=0;
    for(i=0;i<15;i++){
      printf("%d \n", *msg);
      msg++;}
    
    }
    così il risultato è che metto gli interi solo nella prima cella della m.c, mentre vorrei che gli interi fossero messi in successione..

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    mi è venuta un idea...faccio l'incremento del puntatore prima di fare la fork...

    for(i=0;i<5;i++){
    if(i>0) msg++;
    x=fork();


    pero secondo me è una soluzione che non va tanto bene, perchè se mettessi un numero variabili di elementi nel processo figlio dal padre non lo so...e incremento il puntatore sempre di un unità...qualcuno ha idee?

    e se dichiarassi un altra memoria condivisa per 2 indici, sarei accusato dalla mia prof. di essere uno sprecone?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.