C 双向FIFO

C 双向FIFO,c,fifo,C,Fifo,我想实现一个双向fifo。下面的代码正在运行,但未使用双向fifo。我在互联网上搜索过,但没有找到任何好的例子 我该怎么做 谢谢 作者c: #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <fcntl.h> #define MAXLIN

我想实现一个双向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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAXLINE 4096
#定义读取0
#定义写入1
int main(int argc,字符**argv)
{
INTA,b,fd;
做{
fd=打开(“/tmp/myfifo”,仅限打开);
如果(fd==-1)睡眠(1);
}而(fd==-1);
而(1){
scanf(“%d”和“&a”);
scanf(“%d”和“b”);
写入(fd、a、sizeof(int));
写入(fd,&b,sizeof(int));
如果(a==0&&b==0)
{
打破
}
}
关闭(fd);
返回0;
}
读者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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAXLINE 4096
#定义读取0
#定义写入1
内部主(空)
{
int n1,n2;
int-fd;
mkfifo(“/tmp/myfifo”,0660);
fd=打开(“/tmp/myfifo”,仅限ordu);
while(读取(fd,&n1,sizeof(int)))
{
读取(fd和n2,sizeof(int));
如果(n1==0&&n2==0)
{
打破
}
printf(“soma:%d\n”,n1+n2);
printf(“差异:%d\n”,n1-n2);
printf(“除数:%f\n”,n1/(双)n2);
printf(“多重目标:%d\n”,n1*n2);
}
关闭(fd);
返回0;
}

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

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


如前所述,另一种选择是使用Unix套接字。Unix域套接字的设置(套接字创建、初始化和连接)开销比FIFO稍大,但更灵活,并提供双向通信。

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

由于可能出现死锁,通常不鼓励使用双向管道(prog1正在等待来自prog2的数据,而prog2正在等待来自prog1的数据,而prog1正在等待来自prog2的数据…),但这也可能发生在任何解决方法中,也可能发生在SMTP(简单邮件传输协议)等常用协议中因为每一方都在对话中扮演一个角色

如果您认为可能发生死锁,您可能希望至少有一方有一个超时,您可以通过一个轮询功能(包括轮询、选择、pselect和epoll_u*)或安排发送SIGALM(带有报警或其他一些允许更短时间和更多控制的功能)来实现这样你的程序就可以摆脱死锁