某种协同
一般的操作系统,会有一个独立的通信模块 —— 隶属于文件系统 —— IPC通信模块定制标准 —— 进程通信是有标准的 ——system V && posix
管道:
用管道原理进行通信的一定是具有血缘关系的进程:父子,兄弟,爷孙
对应父子进程都具有独立的task_struct对应有独立的struct_file,但对应在数组中相同序号指向同一批文件:对应的stdin,stdout,stderrno都是公用的:
如果父子进程想要创建自己的管道文件,对应一定是存在内存中而非磁盘中。
如何建立通信信道?
对于父子进程来说,读写时文件的inode相同,同一个文件缓冲区
如果父子进程同时进行写入读取,那么对应的管道文件不是就乱了吗?
这也就注定了管道只能进行单向通信:
所以在struct_file中的引用计数就会起作用,对应有不同的fd指向它,引用计数+1。
可以看到上面的内存文件(管道文件)没有名字,也对应叫匿名管道。
可以看到在012后面创建了两个文件:记住下标为0的是读,为1的是写。
接下来创建子进程让子进程写,父进程读:
再向父进程写入:
下面来验证管道中的四种情况:
父进程不读:
对应代码结果:
3.读端正常,写段关闭,读端会读到0,表明文件结尾,不会阻塞。
0:
对应文件读完了。
可以看到后面n变为0,对应文件为空,所以我们要在文件读取是在加一个判断:
对应的结果:
对应代码更完善。
4.写段写入正常,读端关闭,操作系统通过信号干掉正在写入的进程。
代码:
让父进程读5秒就停,子进程继续写对应结果:
对应让子进程写入,父进程读取,为了方便看到退出信号,对应就是操作系统终止了进程
管道的特征:
2.管道只能进行单向通行
细节:
1.自制shell中支持管道(文件重定向),这里不实现了,主要实现下一个
进程池的概念:
代码对应对子进程的描述:
子进程初始化:
对应代码的执行结果:
接下来让子进程执行一点有意义的东西:
输出:*
控制子进程:
执行对应的函数。
对应的结果:
命名管道:
上面的匿名管道都是具有血缘关系之间的进程的通行,那么如果没有血缘关系呢?
对应就是命名管道。
命名管道本质只是管道的一个标识,它不存在这块管道缓冲区还是存在的。
如果两个不同的进程,打开同一个文件的时候,在内核中,操作系统会打开几个文件?
同一个文件。
对应的编码:
对应的结果:
实现一个自己的日志:
共享内存:
原理:
主要分为三步:
创建K:
1.key对应是一个int,至于数字是多少不重要,重要的是它的唯一性,能够让不同的进程执行唯一标识。
脱离连接。
共享内存的本质:
1.开辟一块物理空间,让多个进程映射到同一块物理内存到自己的地址空间进行访问。
2.共享内存的删除不是直接删除,而是删除进程与物理地址的映射关系,到映射链数为0的时候,才为真正的删除。
对应的get:
对应的ctrl接口:
接口的参数都相同,对应的最后一个参数需要自己创建结构体,自己传指针。
就是让不同的进程看到同一个队列:
其中不同的通信方法都是对系统内存中一块空间的数据结构的继承:
对应的key都是面向系统内核的,id都是面向用户的。对应不同的通信方式都是存在同一个指针数组的。
管道通信的不足:
1.AB看到同一份资源,如果不加保护,会导致数据不一致问题。
2.加锁:互斥访问,对应任何时候,只允许一个执行流访问资源。
3.共享的,任何时候只允许一个执行流访问的资源叫临界资源。
解释一个现象:
信号量:
本质:
意味着只能有一个执行流来访问这个临界资源。
两个概念:
2.信号量是几:对应共享资源在信号量中的几号位
信号量凭什么也是通信的一种?
原文地址:https://blog.csdn.net/m0_61497245/article/details/134802558
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_45470.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!