多个进程读写pipe

本文介绍了一个使用有名管道(FIFO)实现多进程通信的例子。通过创建并打开FIFO,一个进程作为写端,两个子进程作为读端。演示了在多个读进程同时读取一个写进程写入的管道数据时的行为。当读进程读取超过第一个写进程写入的数据量时,后续读取将不会获取到任何数据。
#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,(内容逻辑上是分隔的),读时即便读了多个写进程的数据,有效的仍是第一个写进程的数据,
            如何知道每个写进程写了多少数据,再分别用每个读进程按每个写进程写入的数据量来读取,则会正确的读到数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值