#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<iostream>
#include<wait.h>
#include<stdlib.h>
#include<memory.h>
using namespace std;
int main()
{
int fifofd = mkfifo("./bbb", S_IRUSR|S_IWUSR);
cout<<"fifofd:"<<fifofd<<endl;
if(fork())
{int fd3 = open("./bbb", O_RDONLY); -------------------------------> #1
int fd4 = open("./bbb", O_RDONLY); -------------------------------> #1
sleep(10);
char buf[100];
memset(buf, 0, 100);
cout<<"read size:"<<read(fd3, buf, 4)<<endl;----------------------》#2
cout<<buf<<endl;
memset(buf, 0, 100);
cout<<"read size:"<<read(fd4, buf, 4)<<endl;----------------------》#2
cout<<buf<<endl;
exit(0);
}else{
int fd1 = open("./bbb", O_WRONLY); --------------------------------> #1
int fd2 = open("./bbb", O_WRONLY); --------------------------------> #1
write(fd1, "fd1", 4); ---------------------------------------------》#2
write(fd2, "fd2", 4);----------------<span style="font-family: Arial, Helvetica, sans-serif;">---------------------------------------------》#2</span>
}
int status;
wait(&status);
}
结果:
fifofd:-1
read size:4
fd1
read size:4
fd2
注:
如果第一个读端读取8个字节,则输出如下:
fifofd:-1
read size:8
<span style="color:#ff6600;">fd1</span>
read size:0
说明: #1: 有名管道的读与写端的打开必须成对,意思是当写端或读端打开时,会暂时阻塞, 等待另一端打开再执行。
#2: 多个写进程可以写一个pipe,(内容逻辑上是分隔的),读时即便读了多个写进程的数据,有效的仍是第一个写进程的数据,
如何知道每个写进程写了多少数据,再分别用每个读进程按每个写进程写入的数据量来读取,则会正确的读到数据。