Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    8

    C - Matrice in Memoria condivisa

    Sto creando un'applicazione client server in C , Il server fa una fork() per ogni utente connesso , ho
    bisogno di mantenere un elenco aggiornato dei client in linea quindi il mio obbiettivo era creare un array di “Stringhe” condiviso tra tutti i processi , quindi ho riservato lo spazio con smhget() per la matrice m[MAX-UTENTI][MAX-CHAR-NAME] che poi shmat() a i processi.

    La domanda è dove devo allocare le righe della matrice (i nome dei client on-line) in modo da essere condivisi anche essi?
    Attualmente io alloco la stringa “nome” con malloc() e poi faccio puntare una colonna della matrice a essa cioè m[i]=name ;

  2. #2
    Se hai un vettore di char * e usi la malloc per allocare lo spazio a cui questi puntano sicuramente non funzionerà, dato che la memoria fornita dalla malloc è locale al processo corrente (il medesimo indirizzo in un altro processo non è valido o punta ad altra roba). Ma se tu hai dichiarato effettivamente la memoria condivisa come m[MAX-UTENTI][MAX-CHAR-NAME] teoricamente non ti dovrebbe neanche essere possibile scrivere m[i]=malloc(...), dato che è tutto un unico array, e in tal caso dovrebbe bastare la strcpy per copiarci dentro le stringhe.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    8
    Ok grazie questo sicuramente è un passo avanti , cmq quando provo ad accedere direttamente alla vettore char (cioè la riga della matrice ,il nome utente) per esempio m[0][0] avviene Segmentation fault

    Questo è l'operazione con cui conquisto la memoria

    idPlayer = shmget(KEYp,sizeof(char[MAX-CHAR-NAME])*MAX-USER,IPC_CREAT|0666);

    Quindi così ottengo uno spazio pari ad char[MAX-CHAR-NAME])*MAX-USER
    Poi faccio m=(char**)shmat(idPlayer,NULL,0);

    In questo modo m si comporta come un'array di puntatori , effettivamente m[i] punta ad una locazione di memoria .

    Ok fino a qui ci siamo , ma io quando dovevo allocare una matrice in memoria locale con malloc
    per esempio una matrice di int M [ r ][ c ]
    dovevo prima allocare il set delle righe M= (int**)malloc( r * sizeof(int) );
    ed poi allocare singolarmente ogni array
    for(i=0; i<r; i++)
    M[i] = (int*)malloc( c,sizeof(int) );

    Non dovrei riuscire a fare qualcosa di simile anche con la memoria condivisa?

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.