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);
}