请教下Linux下的FIFO问题

我有一个生产者程序,写完数据后后关闭重新打开管道,可是在消费者程序里却读取了多次 请问这是肿么一回事啊

问题是「多输出一个 100」 是吧。你读完之后,又读了一次(应该没作用,而且你没有检查返回),又打印了一次 100,就是第三个 100。

PS 代码是文字,不是图片,直接贴代码更方便。

#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <iostream>
using std::cout;
using std::endl;

#define FIFO "/tmp/boss_fifo"
int main()
{
  int temp;
  int fd = open(FIFO,O_RDONLY);

  
  while(read(fd,&temp,sizeof(temp)))
    {
      cout<<temp<<endl;
      perror("now");
    }

  cout<<read(fd,&temp,sizeof(temp))<<endl;
  cout<<temp<<endl;
  perror("now");
  close(fd);
  return 0;
}

是这样吗

嗯,read(2) 返回 0 表示 EOF(看起来 perror 不认为它是错误)。

看来是read循环的问题,他察觉不到远端已经关闭,把sender重新打开写入的100读入了

?你不是写了 11 个数字吗,然后也读了 11 个数字。最后一个 100 是你自己打印的(不是从 FIFO 中读到的),read 返回 0 时你就不应该再打印了。


正常的结果:

~ $ mkfifo my_pipe
~ $ seq 10 > my_pipe &
~ $ echo 10 > my_pipe &
~ $ cat my_pipe
10
1
2
3
4
5
6
7
8
9
10
Job 2, 'echo 10 > my_pipe &' has ended
Job 1, 'seq 10 > my_pipe &' has ended
~ $

reader中的100是读到的,你看read返回值为0,所以他早就在while循环中读到了呀

按照你的寫法,注意read/write以4字元爲單位。