PDA

Visualizza la versione completa : [C] Qualcosa di alternativo alla memoria condivisa?


_sys/sid
11-10-2005, 14:53
Devo creare un programma che:
- Il Padre Crea n processi figli (tanti) e gestisce un Hashtable (o cmq un po' di dati in RAM)
- Ogni Figlio deve poter accedere all'Hashtable in qualche modo...

Io avevo pensato di utilizzare la memoria condivisa...
Visto che tutti i processi devono andare a leggere quei dati...
Ma non son totalmente convinto della mia scelta...
Qualcuno puo' darmi qualche suggerimento?

Un altra cosa... Il Figlio potrebbe voler modificare un dato (dell'Hashtable)... Conviene inviare la richiesta al padre o se lo puo' fare direttamente lui?

grazie.

oregon
11-10-2005, 19:14
La memoria condivisa puo' essere una soluzione e il "figlio" puo' scrivere direttamente ma a patto di "sincronizzare" questa azione con i "concorrenti" (altri figli o il padre).

Per farlo devi usare un oggetto di sincronizzazione (un mutex, un semaforo ... vedi tu quale ...).

_sys/sid
11-10-2005, 19:21
ok... grazie mille oregon
ma c'e' qualcosa di migliore ? o ritieni che sia gia' un buon metodo ?

Grazie ancora

oregon
12-10-2005, 21:21
Dipende dalla quantita' di dati "scambiata" ... potresti utilizzare winsock o, meglio, i messaggi di Windows (WM_COPYDATA in particolare)

unomichisiada
13-10-2005, 01:01
Si tratta di Inter Process Comunication (IPC), ci sono vari metodi per svolgerla : pipes, memoria condivisa, clipboard, mailbox e altre ancora mi sembra.

infinitejustice
13-10-2005, 02:55
Originariamente inviato da oregon
Dipende dalla quantita' di dati "scambiata" ... potresti utilizzare winsock o, meglio, i messaggi di Windows (WM_COPYDATA in particolare)

Se parla di padri e figli credo sia su unix perche se nn erro su windows nn c' questo tipo di rapporto fra i processi. I due processi sono indipendenti ed possibile gestirne uno tramite una handle che chiunque, nn necessariamente il padre, puo avere.


Il tutto, ovviamente, se mi ricordo ancora qualcosa dal corso di sistemi operativi :stordita:

oregon
13-10-2005, 03:35
Originariamente inviato da infinitejustice
Se parla di padri e figli credo sia su unix perche se nn erro su windows nn c' questo tipo di rapporto fra i processi. I due processi sono indipendenti ed possibile gestirne uno tramite una handle che chiunque, nn necessariamente il padre, puo avere.


Il tutto, ovviamente, se mi ricordo ancora qualcosa dal corso di sistemi operativi :stordita:

In realta' in Windows un "child process" e' un processo che e' stato creato da un altro processo, chiamato "parent process". Il rapporto che esiste tra i due processi c'e', ma e' differente con quello di Unix.

Ovviamente, e' vero che la creazione dei processi nei due sistemi e' abbastanza differente, ma alcuni concetti "di base" sono validi in ambedue gli ambienti e le tecniche di IPC sono abbastanza simili.

In effetti la richiesta sembra piu' per Linux/Unix ma questo significa usare i socket invece di winsock e molte primitive di sincronizzazione molto simili che comunque esistono ...

_sys/sid
14-10-2005, 14:44
Ho un altro piccolo problema che mi sta'
facendo cambiare idea sulla memoria
condivisa... Quello che devo mettere in
memoria condivisa sono delle informazioni
relativi all'utente (quindi stringhe allocate dinamicamente)
e un socket che e' di questo tipo:


typedef struct _ny_socket {
NySockDescriptor fd;
SSL *ssl;
SSL_CTX *ctx;
NySocketState state;
} NySocket;

dove 'ssl' e 'ctx' sono due variabili allocate dinamicamente

Stavo pensando di sostituire la memoria condivisa con un
database almeno per quanto riguarda le informazioni utenti...
ma per il socket? come faccio? Posso salvarlo sul DB? (MySQL)
Oppure avete qualche altra idea?

Grazie

Loading