key_t chiave_sem=IPC_PRIVATE;
//richiesta di 2 semafori ed inizializzazione
sem=semget(chiave_sem,2,IPC_CREAT|0664);
//Inizializzazione dei due semafori
semctl(sem,0,SETVAL,val1);
semctl(sem,1,SETVAL,val2);
int semop(int semid, struct sembuf *sops, unsigned nsops);
Un semaforo è una struttura dati che comprende tra i suoi campi i seguenti:
unsigned short semval; /* semaphore value */
unsigned short semzcnt; /* # waiting for zero */
unsigned short semncnt; /* # waiting for increase */
pid_t sempid; /* process that did last op */
…è su questi che agisce la primitiva semop (in particolare sulla struttura indicata da semid).
Ognuno degli nsops elementi, riferiti dal puntatore sops, specifica un’operazione da compiere sul semaforo. L’operazione è descritta da una struttura, struct sembuf, la quale include i seguenti campi:
unsigned short sem_num; /* semaphore number */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
Due sono i valori che puo’ assumere sem_flg
: IPC_NOWAIT e SEM_UNDO. Se si specifica SEM_UNDO, l’operazione sarà annullata nel momento in cui il processo che la ha eseguita termina.
L’insieme delle operazioni specificate da sops sono eseguite in maniera atomica (le interruzioni saranno disabilitate).
Ogni operazione è eseguita sul semaforo individuato da sem_num (in altre parole sem_num indica su quale semaforo, tra quelli presenti nell’array, dovrà essere eseguita l’operazione).
Il primo semaforo dell’array ha indice 0.
I valori che può assumere il campo sem_op specificano tre possibili tipologie di operazioni che si possono compiere sul semaforo:
Se sem_op è un intero positivo, l’operazione consiste nell’addizionare il valore di sem_op al valore del semaforo (semval).
semval+=sem_op
Inoltre, nel caso in cui sia specificato il flag SEM_UNDO, il sistema aggiornerà il contatore “undo count” (semadj) del processo per il semaforo in questione. E’ utile osservare che quest’ultima operazione non verrà mai bloccata.
Al fine di eseguire l’operazione di “signal”, il processo chiamante dovrà sicuramente avere i permessi necessari alla modifica dei valori del semaforo.
Se sem_op ha valore nullo, l’operazione specificata ( “wait-for-zero”) è articolata nei seguenti passi:
Al fine di eseguire l’operazione di “wait_for_zero”, il processo chiamante dovrà almeno avere i permessi in lettura dei valori del semaforo.
Se sem_op ha valore negativo, l’operazione si articolerà come di seguito:
Al fine di eseguire l’operazione di “wait”, il processo chiamante dovrà sicuramente avere i permessi necessari alla modifica dei valori del semaforo.
Nel caso 2.2 il processo sarà sospeso nell’attesa del verificarsi di una delle seguenti condizioni:
1 ) (semval ≥ |sem_op| ), quando questa condizione sarà verificata il valore di semncnt sarà decrementato e il valore del semaforo sarà modificato come segue
semval-=|sem_op|
Se specificato SEM_UNDO il sistema aggiornerà il contatore “undo count” (semadj) del processo per il semaforo in questione.
2) Il semaforo è rimosso: la system call fallisce (errno = EIDRM).
void Wait_Sem (int id_sem, int numsem) {
struct sembuf sem_buf;
sem_buf.sem_num=numsem;
sem_buf.sem_flg=0;
sem_buf.sem_op=-1;
semop(id_sem,&sem_buf,1); //semaforo rosso
}
void Signal_Sem (int id_sem,int numsem) {
struct sembuf sem_buf;
sem_buf.sem_num=numsem;
sem_buf.sem_flg=0;
sem_buf.sem_op=1;
semop(id_sem,&sem_buf,1); //semaforo verde
}
1. Introduzione ai Sistemi Operativi
5. Scheduling nei sistemi mono-processore
6. Threads, SMP
8. Scheduling Multiprocessore e Real-Time
9. Gestione dei processi nei sistemi operativi Unix/Linux e Window...
10. Introduzione alla Programmazione Concorrente
11. Sincronizzazione nel modello ad ambiente globale
12. Problemi di cooperazione nel modello ad ambiente globale
14. Sincronizzazione nel modello ad ambiente locale
15. Deadlock
16. Programmazione Multithread
18. Memoria Virtuale
20. Il File System
21. Primitive di sincronizzazione nel kernel Linux
22. Esercitazione: System call per la gestione dei processi
23. Esercitazione: Inteprocess Communication e Shared Memory
24. Esercitazione: System Call per la gestione dei semafori in Linu...
25. Esercitazione: Problema dei Produttori e dei Consumatori
26. Posix Threads