Ho provato a sviluppare questa applicazione tramite PIPE per esercitarmi:
Si vuole stampare a video una stringa di testo.
Prima della stampa, si intende censurarne il contenuto evitando di stampare un determinato carattere. Il comando deve far uso di 3 processi:
un processo padre (pubblicatore) e due processifigli (revisore e censore).
Il funzionamento del comando deve essere il seguente:
-Il pubblicatore crea i due figli, revisore e censore;
-Il revisore, una volta creato, comunica la stringa al censore;
-Il censore controlla la stringa ricevuta, eliminando il carattere prescelto, e la invia al pubblicatore;
Il pubblicatore, stampa su video la stringa censurata ricevuta.
La comunicazione tra processi avviene tramite PIPE senza nome.
codice:
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int pubblicatore[2],censore[2],revisore[2];
int pid,ret,i,j,status;
char buffer[10]; // buffer di scambio della stringa
char temp[10]; // buffer temporaneo in cui si salva la stringa senza il carattere 'A'
char c='a'; // carattere da eliminare dalla stringa
char frase[] = "abcdef"; // stringa di partenza
if((ret= pipe(pubblicatore))==-1) printf("Errore nella creazione della Pipe");
pid=fork();
// Nel Padre
if(pid>0){
censore[0] = pubblicatore[0];
censore[1] = pubblicatore[1];
if((ret= pipe(pubblicatore))==-1) printf("Errore nella creazione della Pipe");
pid=fork();
if(pid>0){
revisore[0]=pubblicatore[0];
revisore[1]=pubblicatore[1];
}else{
//sono nel processo figlio REVISORE
printf("Nel Revisore: %s\n",frase);
// invio la stringa frase al figlio censore
write(censore[1],&frase,sizeof(frase));
close(censore[1]);
}
}else{
// sono nel processo figlio CENSORE
read(revisore[0],&buffer,sizeof(buffer));
printf("Nel CENSORE: %s\n",buffer);
// elimino il carattere 'A' da FRASE contenuto in BUFFER e salvo la nuova stringa in TEMP
for(i,j=0; i<strlen(buffer);i++){
if(buffer[i]!= 'a'){
temp[j]=buffer[i];
j++;
}
}
printf("Nel CENSORE (stringa temp): %s\n",temp);
// invio la nuova stringa censurata al padre
write(pubblicatore[1],&temp,sizeof(temp));
close(pubblicatore[1]);
close(revisore[0]);
}
if(pid>0){
wait(&status);
wait(&status);
read(censore[0],&buffer,sizeof(buffer));
printf("Stringa Censurata: %s\n",&buffer);
close(censore[0]);
}
}
Non capisco il perchè, ma la stringa non si riesce a comunicare tra i processi!
Ho provato facendo debug tramite la classica printf();