一:进程通信概述
-
什么是进程间通信?
什么是线程间通信?进程通信:在用户空间实现进程通信是不可能的,通过Linux内核通信
线程间通信:可以在用户空间就可以实现,可以通过全局变量通信。
-
有哪几种通信方式?
管道通信:无名管道、有名管道(文件系统中有名)
信号通信:信号(通知)通信包括:信号的发送、信号的接收和信号的处理。
IPC(Inter-Process Communication)通信:共享内存、消息队列和信号灯。
以上是单机模式下的进程通信(只有一个Linux内核)
Socket通信:存在于一个网络中两个进程之间的通信(两个Linux内核)。
- 进程通信课程的学习思路:每一种通信方式都是基于文件IO的思想。
open:功能:创建或打开进程通信对象。函数形式不一样,有的是有多个函数完成。
write: 功能:向进程通信对象中写入内容。函数形式可能不一样。
read: 功能:从进程通信对象中读取内容。函数形式可能不一样。
close: 功能:关闭或删除进程通信对象。形式可能不一样。
二:无名管道(匿名管道)
通信原理:
无名管道是不能在文件系统中以任何方式看到的半双工管道。半双工管道意味着管道的 一端只读或只写,管道文件是一个特殊的文件,是由队列来实现的。
在文件IO中创建一个文件或打开一个文件是由open函数来实现的,它不能创建管道文件。只能用pipe函数来创建管道。
函数形式:int pipe(int fd[2])
功能:创建管道,为系统调用:unistd.h
参数:就是得到的文件描述符。可见有两个文件描述符:fd[0]和fd[1],管道有一个读端fd[0]用来读和一个写端fd[1]用来写,这个规定不能变。
返回值:成功是0,出错是-1;
例子pipe()
对无名管道中的读写进行判断
由此可见对无名管道中的读写
注意:
1、管道中的东西,读完了就删除了;队列
2、如果管道中没有东西可读,再读的话,则会读阻塞。
验证读阻塞(读完后再次读)
通过查看,看到a.out进程
验证写阻塞(写满了以后再写),
没有输出,说明写满了
验证写阻塞:可以计算出内核开辟的管道有多大。
缓存< 5457
通过管道,链接父子进程中的对象