Corso di Laurea in Ing. Informatica, Universita' La Sapienza
Sistemi Operativi II
Docente Roberto Baldoni

Soluzione della domanda di programmazione (argomento: FIFO - Appello del 5 Aprile 2004).

Le operazioni che devono essere effettuate per implementare le funzionalità richieste sono illustrate di seguito:

  1. prima di tutto si devono creare due processi/thread (la soluzione proposta usa processi), uno che si occupa dell'ascolto sulla fifo, che quindi gioca il ruolo di server, e l'altro che gioca il ruolo di client interagendo con la fifo del partner con cui si vuole comunicare;
  2. per quanto riguarda il processo che fa da server, le operazioni da effettuare sono principalmente l'apertura della fifo e la lettura dei dati spediti dal partner con qui si sta parlando;
  3. per il processo che fa da client, si deve aprire in scrittura la fifo del partner, e scrivere il codice relativo alla lettura di stringhe da tastiera e alla successiva scrittura sulla fifo;
  4. l'ultimo passo è quello della chiusura della fifo in ascolto;

Di seguito viene riportato il codice della soluzione proposta. E' possibile prelevare il file completo qui.

   ret = fork();
   if (ret == 0) {
      // il processo figlio si mette in ascolto sulla
      // propria fifo per la ricezione dei messaggi da
      // parte del partner
      printf("In ascolto su '%s'\n",fifo_name);
      if ((fd = open(fifo_name,O_RDONLY)) < 0) {
         perror("Couldn't open FIFO for reading");
         exit(1);
      }

      while(read(fd,buff,256) > 0) {
         printf("%s: %s",user, buff);
         memset(buff, 0, 256);
      }
      exit(0);
   }
   else {
      // il processo padre si collega alla fifo del
      // partner per mandare i messaggi al partner
      printf("In scrittura su '%s'\n",user);
      if ((fd = open(user,O_WRONLY)) < 0 ) {
         perror("Couldn't open FIFO for writing");
         exit(1);
      }
      while (1) {
         memset(line, 0, COMMAND_LENGTH+1);
         fgets(line,COMMAND_LENGTH,stdin);
         line[COMMAND_LENGTH] = '\0';

         if (strlen(line) == COMMAND_LENGTH) {
            printf("\nCommand too long!\n");
            continue;
         }
         if (strcmp(line, "exit\n") == 0) break;

         if (write(fd,line,strlen(line)) < strlen(line)) {
           fprintf(stderr,"Problem with write\n");
           exit(1);
         }
      }
      printf("Opened communications, please wait.....\n");
      kill(ret, SIGTERM);
      wait(&ret);
      printf("All connections are closed... exit\n");
   }
   unlink(fifo_name);
   exit(0);