Con i files non ho davvero un buon rapporto, e francamente nel mio manuale questa parte non è spiegata granchè chiara, per cui chiedo ancora una volta l'aiuto di qualche anima pia Anche stavolta allego il codice e descrivo il problema nel secondo messaggio, avendo da poco risolto quello principale.

Ringrazio ancora una volta anticipatamente per l'aiuto!


codice:
//un server riceve in input un codice numero cod compreso tra 0 e NC
//In base a cod ricevuto, apre il file cod.fo e lo visualizza sul device /dev/dcod
//Il server puo gestire più richieste contemporaneamente
//Il server non puo accettare piu di NR richieste contemporaneamente, oltre le quali
//visualizza il messaggio "Server Busy, Try Later".
//si assuma stdout come device associato a tutti i /dev/dcod

#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>

#define NC 4
#define NR 5

FILE *f1, *f2, *f3, *f4, *f0;		//da 1 a NC+1

pthread_mutex_t mutex;

void *procedura(void*args);
void filecopy (FILE *ifp, FILE *ofp);

int freee = NR;
int procedure, cod;

int main() {
  
  pthread_t server;
  
  pthread_mutex_init(&mutex, NULL);
  
  while(1) {
    
    int delay = rand() % 4;
    sleep(delay);
    
    cod = rand() % 5;
    printf("File Request : %d.fo \n", cod);
    
    if (freee == 0) {
      printf("Server Busy; try later \n");
    }
    else {
      pthread_mutex_lock(&mutex);
	freee--;
      pthread_mutex_unlock(&mutex);
      
      pthread_create(&server, NULL, procedura, &cod);
    }
    
    if(procedure == 10) break;
    
  }
  return 0;
}

void *procedura(void*args) {
  
  int device = cod;
  
  switch (device) {
    case 0: 
      if( (f0 = fopen("/home/francesco/Scrivania/Sistemi Operativi/Esercitazioni/0.fo","r")) == NULL ) {
	printf("Errore nell'apertura di 0.fo \n");
	break;
      }
      else {
	
	pthread_mutex_lock(&mutex);
	  printf("FILE 0.fo on /dev/d0 :\n");
	  filecopy(f0,stdout);
	  printf("\n\n");
	  fclose(f0);
	pthread_mutex_unlock(&mutex);
	  break;
      }
    case 1:
      if( (f1 = fopen("/home/francesco/Scrivania/Sistemi Operativi/Esercitazioni/1.fo","r")) == NULL ) {
	printf("Errore nell'apertura di 1.fo \n");
	break;
      }
      else {
	pthread_mutex_lock(&mutex);
	  printf("FILE 1.fo on /dev/d1 : \n");
	  filecopy(f1,stdout);
	  printf("\n\n");
	  fclose(f1);
	pthread_mutex_unlock(&mutex);
	  break;
      }
    case 2:
      if( (f2 = fopen("/home/francesco/Scrivania/Sistemi Operativi/Esercitazioni/2.fo","r")) == NULL ) {
	printf("Errore nell'apertura di 2.fo \n");
	break;
      }
      else {
	pthread_mutex_lock(&mutex);
	  printf("FILE 2.fo on /dev/d2 : \n");
	  filecopy(f2,stdout);
	  printf("\n\n");
	  fclose(f2);
	pthread_mutex_unlock(&mutex);
	break;
      }
    case 3:
      if( (f3 = fopen("/home/francesco/Scrivania/Sistemi Operativi/Esercitazioni/3.fo","r")) == NULL ) {
	printf("Errore nell'apertura di 3.fo \n");
	break;
      }
      else {
	pthread_mutex_lock(&mutex);
	  printf("FILE 3.fo on /dev/d3 : \n");
	  filecopy(f3,stdout);
	  printf("\n\n");
	  fclose(f3);
	pthread_mutex_unlock(&mutex);
	break;
      }
    case 4:
      if( (f4 = fopen("/home/francesco/Scrivania/Sistemi Operativi/Esercitazioni/4.fo","r")) == NULL ) {
	printf("Errore nell'apertura di 4.fo \n");
	break;
      }
      else {
	pthread_mutex_lock(&mutex);
	  printf("FILE 4.fo on /dev/d4 : \n");
	  filecopy(f4,stdout);
	  printf("\n\n");
	  fclose(f4);
	pthread_mutex_unlock(&mutex);
	  break;
      }
  }
 
  pthread_mutex_lock(&mutex);
    freee++;
    procedure++;
  pthread_mutex_unlock(&mutex);
  
}

void filecopy(FILE *ifp, FILE *ofp) {
  int c;
  
  while((c=getc(ifp)) != EOF)
      putc(c, ofp);
}