[RISOLTO]Condividere una struttura dati tra processi figli

di il
3 risposte

[RISOLTO]Condividere una struttura dati tra processi figli

Salve a tutti, sono nuovo nel forum. Ho un problema riguardante la condivisione della memoria, in pratica ho una situazione dove per ogni client che si colleghi al server, quest'ultimo generi dei processi figli per gestire le richieste. Il mio problema è che per memorizzare gli ID di tutti i client che si collegano ho generato una struttura del tipo:
typedef struct client{
char *id;
int sockfd;}
client;
int main(int argc, char argv[])
{
.....
size_t shmsize = sizeof(struct client)*10; 
if((id_shm = shmget(IPC_PRIVATE, shmsize, IPC_CREAT | 0666))<0){
perror("shmat");
exit(1);
}

client *client; 
....
if((childpid=fork())==0)
{
 .....
 server_echo(connfd,client,id_shm)
 exit(0);
}
}

void server_echo(....)
{
 ....
 for( ; ;  )
 {
  client=(struct client *) shmat(id_shm,(void *)0,0);
 ....
 }
}
 }
Il mio problema è che non riesco a condividere la memoria, ogni processo figlio mantiene sempre una copia separata della struttura. Grazie mille e scusatemi se sono stato poco chiaro

3 Risposte

  • Re: [RISOLTO]Condividere una struttura dati tra processi figli

    Dovresti usare la pipe. Oppure usare i thread anziché i processi.
  • Re: [RISOLTO]Condividere una struttura dati tra processi figli

    In Linux ci sono anche le API per le shared memory. Che sta pure usando. Quindi le sta' semplicemente usando male
  • Re: [RISOLTO]Condividere una struttura dati tra processi figli

    Infatti il problema è proprio questo, sono sicuro che le sto usando male. Forse il concetto non l'ho capito. Praticamente se ho una struttura da condividere diciamo: struct client *client.
    All'inizio faccio un'inizializzazione a tutti 0 per gli int e null per le stringhe, successivamente creo un segmento di memoria condivisa e a tutti i figli faccio recuperare il segmento (tengo a precisare che non ho utilizzato nessuna funzione per il controllo di accesso in maniera sincronizzata) :
    int id_shm=(struct client *) shmget(IPC_PRIVATE,sizeof(struct cliente *)*10,IPC_CREAT|0666); /* nella funzione padre */ 
    /* successivamente alla fork() nella funzione chiamata dai processi figli passo id_shm come parametro e richiamo il segmento di memoria*/
    
    void server_echo(int sockfd,int id_shm)
    {
     struct client *client;
     client=(struct client*)shmat(id_shm,NULL,0);
     /* da ora in poi, non dovrei aver accesso alla memoria condivisa? */
    } 
    
Devi accedere o registrarti per scrivere nel forum
3 risposte