进程间通信(IPC):进程有独立的地址空间,不能直接访问对方内存,IPC 就是内核提供的、让多个进程交换数据 / 同步信号的机制。
Linux系统编程基础中,进程间通信包括:管道 信号量 共享内存 消息队列 套接字。
今天,我们学习其中之一的——管道。
———————————————————————————————————————————
管道:本质是内核中的一块环形缓冲区,用来在进程之间传递字节流。
分为:有名管道 无名管道
通信方式:半双工,例如对讲机,只能一边说话另一边听。
管道相对于普通文件:1.在内存读写速度快,2.自动完成同步(无数据就会堵塞)。
管道两端分为读端和写端,具有以下特点:
1.管道必须两个进程(读端,写端)同时打开,才能通,只有一个打开会堵塞;
2.管道写端被关闭,读端(n=read())返回值n等于0,结束进程;
3.管道读端被关闭,写端会触发异常,产生SIGPIPE信号,终止进程;
4.管道为空,读会堵塞 管道为满,写会堵塞。
———————————————————————————————————————————
我们一起看看代码是如何实现的吧:
一:有名管道
写端代码:./a
不断向管道文件中写入数据,直到输入end,退出。
读端代码:./b
不断读取管道文件中的数据(打印到屏幕上),直到读端关闭,返回值n为0,退出。
实现:同时打开读写进程
可以看到,实现了两个进程间的通信:当写端输入数据,读端就会输出相应数据,当输入end,读端结束,写端对应结束;
二:无名管道
代码:
在父子进程之间通信。
实现:
可以看到,实现了两个进程间的通信:当子进程输入一个内容,父进程会打印相应的内容。
有名管道和无名管道的区别:
有名管道可以在任意两个进程间通信
无名管道只能在父子进程之间通信
———————————————————————————————————————————
这就是管道的全部内容,感谢您的观看!!