Domanda

Vorrei implementare un fifo bidirezionale. Il seguente codice funziona ma non sta usando fifo bidirezionale. Ho cercato in tutto l'Internet, ma non ho trovato nulla di buono esempio ...

Come posso fare questo?

Grazie,

WRITER.c:

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/types.h>

#include <sys/wait.h>
#include <fcntl.h>



#define MAXLINE 4096

#define READ 0

#define WRITE 1


int main (int argc, char** argv)
{
 int a, b, fd;

 do {
   fd=open("/tmp/myfifo",O_WRONLY);
   if (fd==-1) sleep(1);
  } while (fd==-1);

  while (1) {
   scanf("%d", &a);
   scanf("%d", &b);

   write(fd,&a,sizeof(int));
   write(fd,&b,sizeof(int));

   if (a == 0 && b == 0)
   {
    break;
   }

  }

  close(fd);
  return 0;
}

READER.c:

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/types.h>

#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>




#define MAXLINE 4096

#define READ 0

#define WRITE 1



int main(void)

{
  int n1, n2;
  int fd;

  mkfifo("/tmp/myfifo",0660);
  fd=open("/tmp/myfifo",O_RDONLY);

  while(read(fd, &n1, sizeof(int) ))
  {
 read(fd, &n2, sizeof(int));

 if (n1 == 0 && n2 == 0)
 {
  break;
 }

 printf("soma: %d\n",n1+n2);

  printf("diferenca: %d\n", n1-n2);

   printf("divisao: %f\n", n1/(double)n2);

   printf("multiplicacao: %d\n", n1*n2); 
  }

  close(fd);

  return 0;
}
È stato utile?

Soluzione

FIFO tendono ad essere un modo. Se si desidera un FIFO è possibile sia leggere e scrivere a, è probabile che ciò che si vuole veramente è o un paio di FIFO (uno in ogni direzione) o una presa di UNIX.

Altri suggerimenti

FIFO (noto anche come pipa denominata) fornire un canale di comunicazione interprocesso unidirezionale. Un FIFO ha un fine di lettura e un finale di scrittura. I dati scritti alla fine scrittura di un FIFO possono essere letti dalla fine di lettura del FIFO. Poiché sono unidirezionali, una coppia di FIFO è necessario per la comunicazione bidirezionale.

Chao ha suggerito , un'altra opzione sarebbe quella di utilizzare un socket Unix. socket unix prendere un po 'più overhead configurazione (creazione presa, inizializzazione e collegamento) di un FIFO, ma sono più flessibili e offrono una comunicazione bidirezionale.

Un'altra opzione è quella di utilizzare un psudo-terminale (ptty). È inoltre possibile utilizzare i socket TCP, che hanno in testa superiore socket UNIX, ma avrebbe funzionato.

tubi bidirezionali sono spesso scoraggiati a causa della possibilità di stallo (prog1 è in attesa sui dati di prog2, che è in attesa di dati da prog1 che è in attesa dei dati da PROG2 ...), ma questo può avvenire con una qualsiasi delle soluzioni alternative come pure, e può verificarsi con i protocolli comunemente usati come SMTP (Simple Mail Transport Protocol) come ogni lato ha un ruolo in una conversazione.

Se si pensa che una situazione di stallo potrebbe verificarsi si consiglia di fare almeno un lato ha un timeout, che si può fare con una delle funzioni del sondaggio (tra cui sondaggio, selezionare, pselect, e epoll_ *) o disponendone un SIGALM da consegnare (con allarme o un paio di altre funzioni che consentono di tempi più brevi e maggiore controllo) in modo che il programma può ottenere buttato fuori di stallo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top