管道通信机制详解:无名管道 vs 有名管道

目录

 无名管道(匿名管道)

定义

特点

创建与使用

 有名管道(FIFO)

定义

特点

创建与使用

总结


在多进程通信中,管道是一种非常基本且实用的机制,它允许进程间进行数据传输。根据是否在文件系统中有名称(即是否持久化存在),管道主要分为两大类:无名管道(匿名管道)和有名管道(FIFO)。下面将详细介绍这两种管道的特点、创建方式以及使用场景。

 无名管道(匿名管道)

定义

无名管道是一种简单的进程间通信方式,它是在内存中开辟的一个缓冲区,仅限于具有亲缘关系的进程间使用,即通常是由一个进程通过fork()函数创建其子进程后,两者之间共享的通信通道。无名管道不与文件系统关联,因此得名“无名”。

特点

  • 半双工通信:数据只能单向流动,即在同一时间只能用于读或写,但通过在两个进程中分别创建读端和写端,可以实现双向通信。
  • 临时性:随着创建它的进程的终止而消失,不持久化存在。
  • 亲缘关系限制:仅适用于父子进程或者兄弟进程间的通信。

创建与使用

使用pipe()系统调用创建无名管道:

#include <unistd.h>

int pipe(int pipefd[2]);
  • pipefd[0]为读端,用于读取数据。
  • pipefd[1]为写端,用于写入数据。
int pipefd[2];
if (pipe(pipefd) == -1) {
    perror("Pipe creation failed");
    exit(EXIT_FAILURE);
}

 有名管道(FIFO)

 

定义

有名管道,又称FIFO(First In First Out),是一种特殊类型的文件,存在于文件系统中,任何具有适当权限的进程都可以访问它,从而实现进程间的数据交换。它克服了无名管道的亲缘关系限制,使得不相关的进程也能通过它进行通信。

特点

  • 全系统可见:由于有名管道在文件系统中有对应的命名入口,因此可以在不相关进程间使用。
  • 半双工通信:与无名管道相同,数据也是单向流动,但可通过创建两个FIFO实现双向通信。
  • 持久性:除非显式删除,否则FIFO会一直存在,即使创建它的进程已经终止。

创建与使用

使用mkfifo()系统调用来创建有名管道:

#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(){
    printf("%d进程,开始读取明管道文件\n",getpid());
    
    int fd = open("./myFifo",O_RDONLY);
    
    for(;;){
        char buf[128] = {};
        
        if(read(fd,buf,sizeof(buf)-sizeof(buf[0]))==-1){
            perror("write");
            return -1;
        }
        
        if(fd==0){
            printf("写入端关闭\n");
            break;
        }
        printf("%d进程,读取到数据了%s\n",getpid(),buf);
    
    }
    
    printf("关闭管道\n");
    close(fd);
    unlink("./myFifo");
    return 0;


}

(第二段代码里面有个bug)

总结

无名管道和有名管道都是实现进程间通信的有效手段,选择哪种方式取决于通信需求。无名管道适用于父进程与子进程间的简单数据交换,而有名管道则提供了更灵活的跨进程通信能力,尤其适合那些无直接亲缘关系的进程间通信场景。理解它们的工作原理及差异,能帮助开发者更有效地设计多进程交互的应用程序

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值