问题是「多输出一个 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字元爲單位。