|
|
Il kernel mantiene informazioni relative all'accesso di una risorsa. Le informazioni sono rappresentate per mezzo di record così strutturati:
valori del campo mode
0400 - lettura concessa all'utente possessore della risorsa
0200 - scrittura concessa all'utente possessore della risorsa
0040 - lettura concessa al gruppo possessore della risorsa
0020 - scrittura concessa al gruppo possessore della risorsa
0004 - lettura concessa a tutti gli utenti0002 - scrittura concessa a tutti gli utenti
Code di messaggi
Si tratta di code contenenti dei messaggi. Ogni messaggio si compone di un campo message type (un numero) e di un campo message data. Una coda di messaggi può essere privata o pubblica: se pr 949j94j ivata può essere acceduta solamente dal processo che l'ha creata o da uno dei suoi processi figli; se pubblica può essere acceduta da tutti quei processi che conoscono la chiave della coda. Un processo generalmente scrive o legge messaggi all'interno della coda dopo esservi acceduto. L'ordine di lettura dei messaggi non prevede che vi sua una coda FIFO. Il fatto d spedire messaggi separati implica che tra la fine di un messaggio e l'inizio del successivo ci sia un byte che funga da separatore tra i pacchetti.
Creare una coda di messaggi - msgget()
La system call msgget ( ) permette di creare una coda di messaggi. Essa accetta due parametri: una chiave di coda e un flag. Il primo parametro, la chiave, può essere un IPC PRIVATE (coda di messaggi privata) oppure un numero intero positivo (scelta migliore qualora la coda da creare fosse pubblica). Il secondo parametro, il flag, è un numero ottale che stabilisce i permessi di lettura, scrittura, esecuzione. Il valore di ritorno della msgget è un valore intero, una chiave che serve ad identificare univocamente la coda creata (se vale -1 significa che la coda non è stata creata).
// Obiettivo: creazione di una coda di msg privata fornendo potere di accesso al solo //possessore della risorsa
Struttura del messaggio - struct msgbuf
La struttura 'msgbuf' memorizza un messaggio e consente di fare, successivamente alla propria definizione, accessi in scrittura e lettura dal processo che usa il messaggio.
Quando si alloca memoria per l'area text del messaggio è importante allocare 1 byte per memorizzare il carattere NULL (terminatore). Un messaggio può contenere testo oppure dati binari: in quest'ultimo caso è possibile allocare uno spazio pari alla dimensione della struttura msgbuf + almeno 1 byte inoltre, per copiare il messaggio, si userà la funzione memset ( ) e non la strcpy ( ).
Scrittura di un messaggio contenuto in una coda - msgnd ( )
La system call msgsnd ( ) permette di inserire un messaggio in una coda. Essa copia tutte le strutture dei messaggi in fondo alla coda. I parametri che necessita sono:
int msqid - ID relativo alla coda di messaggi (valore ritornato dal msgget ( ));
struct msgbuf* msg - un puntatore alla struttura dei messaggi (vedere sezione precedente);
int msgsz - dimensione del campo data (mtext) del messaggio espressa in bytes;
int msgflg - flag che specifica la modalità di spedizione del messaggio (zero se si vuole spedire il msg subito, IPC NOWAIT se non è possibile spedire subito il msg senza interrompere il processo, il cui valore di ritorno è -1).
int rc = msgsnd(queue_id, msg, strlen(msg_text)+1, 0);
if (rc == -1)
Lettura di un messaggio contenuto in una coda - msgrcv ( )
Per leggere un messaggio da una coda si usa la system call msgrcv che ha i seguenti parametri:
int msqid - ID relativo alla coda di messaggi (valore ritornato dal msgget ( ));
struct msgbuf* msg - un puntatore preallocato alla struttura msgbuf;
int msgsz - dimensione del campo data (mtext) del messaggio espressa in bytes da ricevere(non deve essere più grande dello spazio allocato per il campo text in msg;
int msgtyp - Tipo del messaggio da leggere (0 ritorna il primo messaggio nella coda, un intero positivo: ritorna il primo messaggio della coda avente mtype uguale al numero dato; un intero negativo: ritorna il primo messaggio il cui valore è uguale o minore al valore assoluto del numero negativo);
int msgflg - a logical 'or' combination of any of the following flags:
Esempio di lettura di un messaggio dalla coda:
// preparazione della msg structure larga tanto da poter contenere "hello world"
struct msgbuf* recv_msg =
(struct msgbuf*)malloc(sizeof(struct msgbuf)+strlen("hello world"));
// uso di msgrcv() per leggere il messaggio. Siccome va bene qualsiasi tipo
// uso '0' come parametro type e non uso nessun flag (flag=0).
int rc = msgrcv(queue_id, recv_msg, strlen("hello world")+1, 0, 0);
if (rc == -1)
N.B: se la dimensione del campo data è maggiore di strlen("hello world")+1 allora si verificherebbe un errore; se non c'è un messaggio nella coda, ala chiamata a msgrcv()potrebbe bloccare il processo finchè: 1- viene messo un messaggio nella coda; 2- la coda viene rimossa following happens; 3- il processo riceve un segnale).
Esempi
queue_sender.c = Crea una coda di messaggi pubblica che viene usata per inviare messaggi con differenti priorità. queue_reader.c = Legge i messaggi su una coda e, tramite essi, esegue qualcosa (nell'esempio stampa il loro contenuto su video). Sulla linea di comando viene passato un numero che rappresenta la priorità del messaggio da leggere.
Privacy |
Articolo informazione
Commentare questo articolo:Non sei registratoDevi essere registrato per commentare ISCRIVITI |
Copiare il codice nella pagina web del tuo sito. |
Copyright InfTub.com 2024