Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] Problema Apertura Files e Stampa a video del loro contenuto

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

  2. #2
    chiedo venia, ho risolto il problema ed individuato gli errori :

    le opzioni dello swtich vanno senza apici (me tapino),
    in più mancava il break alla fine di ogni operazione dentro i vari "case" !

    EDIT :

    approfitto per chiedere a qualche esperto se (ed eventualmente come) è possibile eliminare l'enorme switch facendo sì che in base al cod, magari con una qualche sorta di test, venga avviata la procedura sul file corrispondente, senza bisogno di enumerare i casi uno per uno (ed aumentando così la facilità di modifica del codice, andando esclusivamente ad agire su NC in fase di #define).

    grazie!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.