PDA

Visualizza la versione completa : [C] System Call UNIX (da guru)


mr.smile
07-07-2004, 13:58
E' una cosa un po' specifica, come direbbe il mio prof di S.O. una cosa da Guru...

Io ho implementato un programma che fa uso delle risorsi IPCS uso una coda di messaggi che salava i dati su una memoria condivisa.
in particolare uso il metodo rcvbuf(...) che manda in wait il sistema fino a che non viene ricevuto un messaggio di un determinato tipo.


Come mai rcvbuf si sblocca se mando una signal SIGUSR1???????????
Come posso evitare che questo succeda... voi avete delle idee... io no...!? Ho esaurito ogni risorsa...!

Ciao a tutti...
Grazie in anticipo se rispondete..!

Ed_Bunker
07-07-2004, 14:09
Spiegati un attimino meglio.
Cos'e' questo ?!?
"...un programma che fa uso delle risorsi IPCS uso una coda di messaggi che salava i dati su una memoria condivisa..."
Talebano ?!?

:D

mr.smile
07-07-2004, 22:08
Ok...devo creare un programma che gestista dei messaggi scritti dagli utenti... una cosa molto rudimentale. C' un programma demone che ascolta delle richieste da parte di due programmi invia e ricevi.

Il demone implementato con:
- coda di messaggi che permette di gestire tramite le funzioni msgrcv e msgsnd l'invio e la ricezione dei messaggi

- Memoria condivisa - un array dove ogni indice contiene un messaggio

- Semafori per la sincronizzazione.

il metodo msgrcv entra in loop e aspetta fino a quando non riceve un messaggio di una certa tipologia da msgsnd...

Per questa parte sono a posto... il problema che implemento anche altri metodi per deallocare le risorse... se chiamo una "signal" con il tipo SIGUSR1 la msgrcv esce dal loop e magicamente smette di attendere in ricezione!

Mi chiedo c' un metodo per impedire questo?????
Sul man non lo trovo...

Non sono convinto ancora di essermi spiegato bene...

Ed_Bunker
07-07-2004, 22:22
Originariamente inviato da mr.smile
Ok...devo creare un programma che gestista dei messaggi scritti dagli utenti... una cosa molto rudimentale. C' un programma demone che ascolta delle richieste da parte di due programmi invia e ricevi.

Il demone implementato con:
- coda di messaggi che permette di gestire tramite le funzioni msgrcv e msgsnd l'invio e la ricezione dei messaggi

- Memoria condivisa - un array dove ogni indice contiene un messaggio

- Semafori per la sincronizzazione.

il metodo msgrcv entra in loop e aspetta fino a quando non riceve un messaggio di una certa tipologia da msgsnd...

Per questa parte sono a posto... il problema che implemento anche altri metodi per deallocare le risorse... se chiamo una "signal" con il tipo SIGUSR1 la msgrcv esce dal loop e magicamente smette di attendere in ricezione!

Mi chiedo c' un metodo per impedire questo?????
Sul man non lo trovo...

Non sono convinto ancora di essermi spiegato bene...

Cioe' ti servirebbe catturare il segnale SIGUSR1 per gestirlo in maniera "particolare" ? Hai provato ad utilizzare la funzione sigaction(...) anziche' la signal(...) ?

Ikitt
08-07-2004, 08:10
Originariamente inviato da mr.smile

Come mai rcvbuf si sblocca se mando una signal SIGUSR1???????????

Si blocca o viene interrotto?

mr.smile
08-07-2004, 12:29
Purtroppo io devo usare una signal con SIGUSR1...
non posso fare altro... nelle specifiche...

msgrcv si sblocca... nel senso... smette di aspettare ed convinta di averer ricevuto un messaggio.
Inserisce nuovamente in memoria condivista l'ultimo messaggio che era gi stato mandato..! e poi torna a ricevere...

Ikitt
08-07-2004, 13:00
Originariamente inviato da mr.smile
msgrcv si sblocca... nel senso... smette di aspettare ed convinta di averer ricevuto un messaggio.
Inserisce nuovamente in memoria condivista l'ultimo messaggio che era gi stato mandato..! e poi torna a ricevere...

Allora potrebbe darsi che sia interrotta dall'arrivo di SIGUSR1. Verifica questa possibilita`, se non l'hai gia` fatto.

mr.smile
08-07-2004, 23:55
Certo... sicuramente interrotta dalla SIGUSR1...
nel man viene anche accennato...!

Il punto proprio questo...! Come far s che non si intralcino?

alesssia
09-07-2004, 09:38
Un processo esce dalla msgrcv quando riceve un segnale, guarda
> man msgrcv

Noi l'abbiamo risolto mettendo un flag, ma se trovi soluzioni un po' pi eleganti dillo!!!

mr.smile
09-07-2004, 10:23
Cio metti un flag... dove e per cosa...?
Il man lo dice ma non che ti dice come porre rimedio a questa cosa...!

Loading