Salve a tutti ho un problema coi semafori.
Questo è il testo del programma che devo svolgere:
Un tratto autostradale delimitato da una barriera di ingresso (dotata di 3 caselli)
[Vi sono un certo numero N (maggiore di 10) di auto descritte in un file di testo che viene letto all'inizio. Per ogni auto, nel file viene indicata la sua velocita' media con un valore V compreso tra 50 e 100 (chiaramente, ogni auto ha la propria velocita').

Vi sara' un generatore delle auto che legge in anticipo tutto il file eche genera tutte le auto descritte.]

Appena generata, una auto decide in quale dei 3 caselli della barriera di ingresso accodarsi. E si mette in coda a tale casello.
(Il modo in cui l'auto sceglie il casello e' a vostra scelta).

Questo è il programma che ho fatto fino adesso:
codice:

codice:
#include <stdio.h>
#include <stdlib.h>

typedef struct elemento {
   char nome[20];
   int v_media;
   int ticket;
   struct elemento *next;
}TipoElem; /* Meglio dare un nome diverso al tipo */

typedef TipoElem * TipoLista; /* Questo serve per definire il tipo della lista
                               (per non commettere errori logici ecc...) e per
                        rendere il codice un po' più semplice da capire */


TipoLista crea_lista (){
  /* Questa funzione usa l'inserimento IN TESTA */
   TipoLista listaAuto = NULL;
      TipoElem *nuovo; /* Serve per creare sempre un nuovo nodo */

      FILE *catalogo = fopen ("elenco_auto.txt", "r");
      if (!catalogo)
         printf ("Errore in apertura file!");

      else {
     /* Se il file non è vuoto inizio ad aggiungere le auto,
       fino a quando non arrivo alla fine del file (EOF),
      in pratica così il programma legge qualsiasi file
      formattato in questo modo e non serve sapere il numero
      di elementi contenuti... */
         while (!feof(catalogo)){
            nuovo = malloc (sizeof(TipoElem)); /* Alloco il nuovo elemento */
            fscanf (catalogo ,"%s\n%d", nuovo->nome, &nuovo->v_media);
            nuovo->ticket =  rand() % 3 + 1;
            nuovo->next = listaAuto; /* Assegno il nodo successivo a questo come l'inizio della "vecchia" lista */
            listaAuto = nuovo; /* E poi assesto la lista sul primo vero nodo, che ora è diventato
           proprio questo! Ecco l'inserimento in testa... */
         }

    }

return listaAuto;
}

typedef struct{
   int valore;
   struct TipoElem *lista;
}semaforo;

wait (semaforo *s) {
   s->valore--;
   if (s->valore < 0){
      block();

   }
}

void visualizza_lista(TipoLista p)
{

   printf("lista: \n -> ");


   while(p)
   {
      printf("%s", p->nome);
      printf(": %d\n", p->v_media);
      printf("Num ticket: %d\n", p->ticket);
      printf(" -> ");
      p = p->next;
   }
   printf("NULL");
   return;
}


int main()
{

   TipoLista lista;
   semaforo s;
   lista = crea_lista();
   visualizza_lista(lista);


   printf ("\n\nFine");
   system ("PAUSE");


   return 0;
}

Dal libro non riesco a capire come devo impostare e gestire il codice dei semafori. Non so se devo usarne uno unico o tre e appunto non so come impostarli.Spero che mi possiate dare una mano.
Grazie in anticipo e buona giornata