使用管道实现两个进程之间的通信

本文介绍了如何使用管道进行进程间通信,并通过select函数实现实时双向通信。详细展示了进程A和进程B之间的通信流程,包括如何正确打开管道、设置文件描述符集以及使用select监听多个文件描述符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天学到管道的使用,感觉挺简单的,自己实际写了下,深陷逻辑中不能自拔。
现有进程a和进程b,管道单向传输数据,两个进程链接两个管道实现初级同步。
一个进程打开管道的读,另一个进程就打开管道的写。
进程a:

int fdr=open("1",O_RDONLY);
    if(-1 == fdr)
    {
        perror("open dr");
        return -1;
    }
    int fdw=open("2",O_WRONLY);
    if(-1 == fdw)
    {
        perror("open dw");
        return -1;
    }

进程b:

int fdw=open("1",O_WRONLY);
    if(-1 == fdw)
    {
        perror("open dw");
            return -1;
    }
    int fdr=open("2",O_RDONLY);
    if(-1 == fdr)
        {
            perror("open dr");
            return -1;
        }

注意进程中打开管道的顺序必须是成对的,即是对于同一个管道,a进程是写
操作,b进程在和a同样的执行顺序下执行读操作。不然就会循环等待,接受不
到对方的信息。
为了实现双方的实时通信,需要使用 I/O多路转接模型,使用select函数,使用的头文件
sys/types.h sys/time.h unistd.h
函数的原型是 int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds
,struct timeval *timeout)
进程a:

fd_set set;
    while(1)
    {
        FD_ZERO(&set);
        FD_SET(fdr,&set);
        FD_SET(0,&set);
       memset(buff,0,sizeof(buff));
        int ret=select(fdr+1,&set,NULL,NULL,NULL);
        if(FD_ISSET(fdr,&set))
        {
            read(fdr,buff,sizeof(buff));
            puts(buff);
        }

        if(FD_ISSET(0,&set))
        {
            read(0,buff,sizeof(buff));
        //  scanf("%s",buff);
            write(fdw,buff,strlen(buff)-1);
        }
    }
    close(fdr);
    close(fdw);

进程b:

fd_set set;
    while(1)
    {
        FD_ZERO(&set);
        FD_SET(fdr,&set);
        FD_SET(0,&set);
        memset(buff,0,sizeof(buff));
        int ret=select(fdr+1,&set,NULL,NULL,NULL);
        if(FD_ISSET(0,&set))
        {
            read(0,buff,sizeof(buff));
        //  scanf("%s",buff);
            write(fdw,buff,strlen(buff)-1);
        }
        if(FD_ISSET(fdr,&set))
        {
            read(fdr,buff,sizeof(buff));
            puts(buff);
        }
    }
    close(fdr);
    close(fdw);

**此处小心**fd_set是文件控制符的集合,需要自己创建。最后在这个实例中,实现进程的通信,
需要监听writre,即时标准输入stdin(STDIN_FILENO)。

本人知识有限,不足之处还请指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值