【Linux系统编程】进程间通讯--管道

本文深入探讨了多进程编程的必要性和进程间通讯(IPC)机制,详细讲解了有名管道和无名管道的工作原理及应用场景,为读者提供了丰富的多进程编程实践指导。

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

    首先我们可以思考一下,为什么有多进程编程?通俗来讲,多进程编程是为了让多个子任务同时并发运行,并且彼此间协调工作,以完成一个更大的任务,而不仅仅是数据的增加。而进程间都是相互独立的,要完成进程间通讯,必须共享一些资源。由此引出了进程间通讯的几种方式:管道、信号量、消息队列、共享内存、socket。其中前四种是同一台主机上进程间通讯,最后一种是不同主机上进程间通讯。socket套接字在后边的网络编程中介绍,下面我先介绍管道。

    管道文件只有两种打开方式:(1)只读;(2)只写。打开文件时需要至少一读一写同时打开,由一个进程执行写操作,其余的进程执行读操作。当管道文件为空时,读端会阻塞;当管道写满时,写端会阻塞。通讯数据遵循先进先出的原则,并且都是半双工通讯。管道分为有名管道和无名管道两种。

    1.有名管道

    有名管道又称为命令管道,可以应用于同一台主机上有权限访问的任意n个进程间通讯(n>=2)。有名管道并不占用磁盘block空间,只是在磁盘上存在一个管道文件标识,管道文件大小一直为0。数据缓存在内存上,因此效率相对较高。

管道文件本身在磁盘中,而打开文件以后写入的数据在内存中存储。

     创建方式:命令创建  mkfifo fifo(文件名)

                       代码创建  int mkfifo(const char* pathname,mode_t mode);

     2.无名管道

     无名管道不存在管道文件标识。其原理是:借助父子进程间共享fork()之前打开的文件描述符。因此无名管道只适用于父子进程间通讯,不能在网络间通讯。而且是单向的,只能一端读,一端写。无名管道的数据也在内存中缓存。

     创建方式:int pipe(int fd[2]);

     创建无名管道后得到两个文件描述符,一个读fd[0],一个写fd[1]。先创建无名管道,后fork()。要想关闭无名管道,父子进程都应关闭。

    

 

 

 

 

 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值