Sistema operacional utilizado: Linux debian 2.6.32-5-amd64O nosso caso de exemplo sera com o que chamamos de "Named PIPES" tambem conhecidas como FIFO. Onde a utilizaremos para comunicacao entre dois processos. Basicamente, teremos um servidor, que criara uma PIPE/FIFO onde o cliente escrevera um comando. O Servidor lera essa mensagem, e escrevera na PIPE/FIFO do cliente a resposta do comando. Ou seja, o cliente tambem tera que criar sua PIPE para que o servidor possa escrever. Entao, utilizaremos duas PIPES, uma criada pelo Server e a outra criada pelo cliente. A Pipe criada pelo servidor deve ser conhecida antes de rodarmos o cliente. O cliente ira criar sua Pipe pelo PID do processo e ira transmitir o nome da Pipe para o servidor atraves da PIPE do server, assim o servidor sera capaz de abrir a Pipe do cliente e escrever o resultado nela.No nosso exemplo vamos usar tres arquivos de codificacao.Main.cpp Esse arquivo contera a codificacao para o nosso servidorclient.cpp Esse arquivo contera a codificacao para o nosso clienteheader_fifo.h Esse arquivo contera a implementacao de nossa classe.Teremos tamem um quarto arquivo, um Makefile, que sera responsavel por compilar nosso exemplo.Teremos duas opcoes de compilacao, uma para Debug, onde voce podera ver as mensagens sendo trocadas entre cliente e servidor, o que sera util para modificar ou entender melhor o processo de comunicacao.Entao vamos ao codigo de nosso servidor:#include "fifo_header.h"int main(int argc, char *argv[]){ int processID; if(argv[1]!=NULL) { if(strcmp("stop",argv[1]) ==0) { system("killall PipeServer"); return 1; } else { if(strcmp("Debug",argv[1]) !=0) { processID = fork(); if (processID < 0) { exit(EXIT_FAILURE); } else { if (processID > 0) { exit(EXIT_SUCCESS); } } } } } FIFO myFifo, clientFifo; int PipeToWrite, PipeToRead, returnedValue, ready = 0; data buffer; myFifo.setName(argv[1]); myFifo.setPath(strcat(strcat(argv[2],"/"),argv[1]));#ifdef DEBUG cout << "Name of FIFO: " << myFifo.getName() << endl; cout << "Path of FIFO: " <<myFifo.getPath() << endl; cout.flush();#endif /* Vamos iniciar a criacao de nossa PIPE */ mknod(myFifo.getName(), S_IFIFO | 0666, 0); /* Vamos abrir a nossa PIPE que usaremos para ler do cliente */ returnedValue = open(myFifo.getName(), O_RDONLY | O_NDELAY); if(returnedValue == -1) { printf("\n\tError in open PIPE\n"); perror(myFifo.getMessage()); return 1; } myFifo.pipeDescriptor = returnedValue; while (true) { returnedValue = myFifo.readFromPipe(clientFifo); if(returnedValue > 0) {#ifdef DEBUG cout <<"retuned value from read: "<<returnedValue <<endl; cout <<"What Client said is: " <<myFifo.getMessage()<<endl;#endif ready=0; do { returnedValue = open(clientFifo.getName(), O_WRONLY/*|O_NDELAY*/); if(returnedValue == -1) { perror(clientFifo.getName()); return 1; }#ifdef DEBUG cout <<"Pipe client Name: "<< clientFifo.getName() <<endl;#endif clientFifo.pipeDescriptor = returnedValue; myFifo.writeToPipe(clientFifo); ready=1; }while(!ready); clientFifo.closePipe(); } } return 1;}Agora o codigo de nosso cliente#include "fifo_header.h"int main(int argc, char *argv[]){ /* argv deve ser o mesmo do servidor. Assim termos como informar o nome da PIPE e o local onde o servidor a criou */ FIFO myFifo, serverFifo; data buffer; int numberOfBytes, returnedValue, readOK; serverFifo.setName(argv[1]); serverFifo.setPath(strcat(strcat(argv[2],"/"),argv[1]));#ifdef DEBUG cout << "Name of FIFO: " << myFifo.getName() << endl; cout << "Path of FIFO: " <<myFifo.getPath() << endl; cout.flush();#endif sprintf(buffer.name, "/home/eduardo/Documents/programas/FIFO/%d", getpid( )); myFifo.setName(buffer.name); if (mknod(myFifo.getName(), S_IFIFO | 0666, 0) < 0) { perror(myFifo.getName()); return 1; } if ((returnedValue = open(serverFifo.getName(), O_WRONLY)) == -1) { perror(serverFifo.getName()); return 1; }