【问题标题】:Bidirectional FIFO双向先进先出
【发布时间】:2010-04-28 01:54:19
【问题描述】:

我想实现一个双向先进先出。下面的代码正在运行,但它没有使用双向 fifo。我在互联网上搜索过,但没有找到任何好的例子......

我该怎么做?

谢谢,

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;
}

【问题讨论】:

    标签: c fifo


    【解决方案1】:

    FIFO 往往是一种方式。如果您想要一个既可以读取又可以写入的 FIFO,您真正想要的可能是一对 FIFO(每个方向一个)或一个 UNIX 套接字。

    【讨论】:

      【解决方案2】:

      FIFO(也称为命名管道)提供单向的进程间通信通道。 FIFO 有一个读端和一个写端。写入 FIFO 写端的数据可以从 FIFO 读端读取。因为它们是单向的,所以双向通信需要一对 FIFO。

      作为cHao suggested,另一种选择是使用 Unix 套接字。 Unix 域套接字的设置(套接字创建、初始化和连接)比 FIFO 需要更多开销,但更灵活并提供双向通信。

      【讨论】:

        【解决方案3】:

        另一种选择是使用伪终端 (ptty)。您也可以使用 TCP 套接字,它的开销比 UNIX 套接字高,但可以工作。

        由于死锁的可能性,通常不鼓励双向管道(prog1 正在等待来自 prog2 的数据,而后者正在等待来自 prog1 的数据,而后者正在等待来自 prog2 的数据......),但这可能发生在任何变通方法中也可以使用常用的协议,如 SMTP(简单邮件传输协议),因为每一方都在对话中发挥作用。

        如果您认为可能会发生死锁,您可能希望至少一侧有超时,您可以通过其中一个轮询函数(包括 poll、select、pselect 和 epoll_*)或通过安排一个 SIGALM 被交付(带有警报或其他一些允许更短时间和更多控制的功能),以便您的程序可以摆脱僵局。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-27
          • 1970-01-01
          • 1970-01-01
          • 2016-05-07
          • 1970-01-01
          相关资源
          最近更新 更多