2

双方向 fifo を実装したいと思います。以下のコードは機能していますが、双方向 fifo を使用していません。ネットでいろいろ調べたのですが、いい例がありません...

どうやってやるの?

ありがとう、

ライター.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;
}
4

3 に答える 3

15

FIFO は一方向になる傾向があります。読み取りと書き込みの両方が可能な FIFO が必要な場合は、FIFO のペア (各方向に 1 つ) または UNIX ソケットのいずれかが本当に必要になる可能性があります。

于 2010-04-27T15:21:19.797 に答える
3

FIFO (名前付きパイプとも呼ばれる) は、一方向のプロセス間通信チャネルを提供します。FIFO には読み取り側と書き込み側があります。FIFO の書き込み側に書き込まれたデータは、FIFO の読み取り側から読み取ることができます。これらは単方向であるため、双方向通信には一対の FIFO が必要です。

cHaoが提案したように、もう 1 つのオプションは Unix ソケットを使用することです。Unix ドメイン ソケットは、FIFO よりもセットアップ (ソケットの作成、初期化、および接続) に多少のオーバーヘッドがかかりますが、柔軟性が高く、双方向通信を提供します。

于 2010-04-27T15:46:52.400 に答える
0

もう1つのオプションは、疑似端末(ptty)を使用することです。UNIXソケットよりもオーバーヘッドが高いTCPソケットを使用することもできますが、機能します。

デッドロックの可能性があるため、双方向パイプは推奨されないことがよくあります(prog1はprog2からのデータを待機しています。prog1はprog2からのデータを待機しています...)が、これは回避策のいずれかでも発生する可能性があります。また、SMTP(簡易メールトランスポートプロトコル)などの一般的に使用されるプロトコルでは、それぞれの側が会話で役割を果たすため、発生する可能性があります。

デッドロックが発生する可能性があると思われる場合は、少なくとも一方の側にタイムアウトを設定することをお勧めします。これは、ポーリング関数(poll、select、pselect、およびepoll_ *を含む)の1つによって、またはSIGALMをプログラムがデッドロックから抜け出すことができるように(アラームまたはより短い時間とより多くの制御を可能にする他のいくつかの機能を使用して)配信されます。

于 2010-04-27T17:54:19.010 に答える