Le operazioni che devono essere effettuate per implementare le funzionalità richieste sono illustrate di seguito:
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);