Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //da eseguire come: dal primo terminale ./chat pippo paperino dal secondo terminale ./chat paperino pippo
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- //mkfifo, open
- #include <sys/types.h>
- #include <sys/stat.h>
- //open
- #include <fcntl.h>
- //read, write
- #include <unistd.h>
- //signal
- #include <signal.h>
- char inpipe[20];
- char outpipe[20];
- void safeClose(){
- unlink(inpipe);
- unlink(outpipe);
- exit(1);
- }
- int main(int argc, char const *argv[]){
- //il programma deve essere chiamato con i due nickname altrimente termina
- if(argc < 3){
- perror("La chat deve partire con 2 argomenti: tuo nick, il nick del tuo interlocutore\n");
- exit(1);
- }
- //se ho i due nickname creo due pipe con i nomi di nickname
- strcpy(inpipe, argv[1]);
- strcpy(outpipe, argv[2]);
- signal(SIGINT, safeClose); //se mi fermano con ctrl-c rimuovo le pipe
- //i nicknames devono essere diversi
- if(!strcmp(inpipe, outpipe)){
- perror("I nickname non devono essere uguali\n");
- exit(1);
- }
- //per convenzione il figlio scrive e il padre legge
- int figlio;
- char mess[100];
- //se la fork va male esco
- if((figlio = fork()) < 0){
- perror("Errore fork\n");
- exit(1);
- }
- //il figlio legge dalla pipe, quindi apre la inpipe in lettura
- if(figlio == 0){
- mkfifo(inpipe, 0666);
- int fd0;
- //se non sono riuscito ad aprire la pipe esco con l'erore
- if((fd0 = open(inpipe, O_RDONLY)) < 0){
- perror("Errore apertura pipe");
- exit(1);
- }
- int i;
- //sto in ascolto sulla pipe e scivo sul stdout il messaggio ricevuto
- while(1){
- i = 0;
- //accumulo il messaggio
- while((i < 100) && read(fd0, &mess[i], 1) && mess[i] && (mess[i++] != '\n'));
- /*
- * una volta ricevuto il messaggio lo scrivo sul stdout ma se chiudo
- * uno dei due interlocutori la read mi da 0 e stampa al infinito l'ultimo
- * messaggio ricevuto quindi metto il controllo, se ho ricevuto 0 byte
- * e sono passato del while significa che nessuno ci scriverà più sulla pipe
- */
- if(i)
- printf("[%s] %s\n", outpipe, mess);
- }
- }
- //qui arriva solo il padre che si mette in ascolto sul stdin, manda il mess sulla pipe
- mkfifo(outpipe, 0666);
- int fd1;
- if((fd1 = open(outpipe, O_WRONLY)) < 0){
- perror("Errore apertura pipe");
- exit(1);
- }
- while(1){
- //da migliorare la parte del scanf in quanto manda una parola
- //alla volta invece di una frase intera
- scanf("%s", mess);
- write(fd1, mess, strlen(mess)+1);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement