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.
Non capisco il perchè, ma la stringa non si riesce a comunicare tra i processi!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]); } }
Ho provato facendo debug tramite la classica printf();

Rispondi quotando

