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

Anche stavolta allego il codice e descrivo il problema nel secondo messaggio, avendo da poco risolto quello principale.
Rispondi quotando