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

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

Si vuole realizzare una semplice chat tramite le FIFO UNIX. Il programma da realizzare deve gestire concorrentemente la ricezione e l'invio di nuovi messaggi . La comunicazione tra due programmi omologhi avviene su due fifo differenti:

  1. all'avvio il programma richiede, tramite parametro a riga di comando, un identificativo del programma stesso (ad esempio “pluto”). Tale identificativo sarà anche il nome della fifo su cui il programma si metterà in attesa di connessioni.
  2. Successivamente, il programma richiede l'inserimento di un identificativo (ad esempio “pippo”) di un altro programma con il quale si vuole comunicare.
  3. il programma “pluto” leggerà da tastiera stringhe per poi trasferirle al programma “pippo” che le stamperà a video.

Di seguito viene riportato lo scheletro del codice che realizza la chat descritta: scrivere il codice mancante.

#include  <fcntl.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <string.h>
#include  <signal.h>
#include  <sys/errno.h>
#include  <sys/stat.h>
#include  <sys/types.h>
#include  <unistd.h>

#define   COMMAND_LENGTH  1024
extern int errno;

void handler();

char* fifo_name;

int main(int argc, char *argv[]) {
   int fd, i=1;
   char line[COMMAND_LENGTH+1];
   char buff[256];
   int ret;
   char* user;

   signal(SIGPIPE, handler);
   signal(SIGINT,  handler);
   signal(SIGHUP,  handler);

   if (argc==1) {
      printf("Sintassi: %s username\n", argv[0]);
      exit(0);
   }
   
   fifo_name = (char*)malloc(sizeof(argv[1]));
   strcpy(fifo_name, argv[1]);

   if (argc==1) {
      printf("Sintassi: %s username\n", argv[0]);
      exit(0);
   }
   // crea la fifo "server"
   if ((mkfifo(fifo_name,O_CREAT|0666) < 0) && (errno != EEXIST)) {
      perror("Can't create FIFO");
      exit(1);
   }

   // stabilisce la comunicazione con il partner
   printf("Inserire lo user name della persona con cui vuoi parlare: ");
   fgets(buff, 256,stdin);
   user = (char*)malloc(sizeof(char*)*(strlen(buff)-1));
   for (i=0; i < (strlen(buff)-1); i++)
      user[i] = buff[i];
   user[i]='\0';

   // completare il codice
}

void handler() {
   printf("########### Error ###########\nPartner has been disconnected..... process exit.\n#############################\n\n");
   unlink(fifo_name);
   exit(1);
}