首页
学习
活动
专区
圈层
工具
发布

双向FIFO
EN

Stack Overflow用户
提问于 2010-04-27 23:00:31
回答 3查看 6.9K关注 0票数 2

我想实现一个双向fifo。下面的代码运行正常,但它没有使用双向fifo。我已经在互联网上找遍了,但没有找到任何好的例子。

我该怎么做呢?

谢谢,

WRITER.c:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-27 23:21:20

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

票数 15
EN

Stack Overflow用户

发布于 2010-04-27 23:46:52

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

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

票数 3
EN

Stack Overflow用户

发布于 2010-04-28 01:54:19

另一种选择是使用psudo-terminal (ptty)。您还可以使用TCP套接字,它比UNIX套接字具有更高的开销,但也可以工作。

由于死锁的可能性,双向管道通常是不被鼓励的(prog1正在等待来自prog2的数据,而prog1正在等待来自prog2的数据...),但这也可能发生在任何一种变通方法中,并且可能发生在常用的协议中,比如SMTP (简单邮件传输协议),因为每一方都在会话中扮演着一个角色。

如果您认为可能发生死锁,您可能希望至少有一方具有超时,这可以通过一个轮询函数(包括poll、select、pselect和epoll_*)或通过安排发送SIGALM (带有警报或其他一些允许更短时间和更多控制的函数)来实现,这样您的程序就可以被踢出死锁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2722293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档