最近面试被问到进程之间通信,虽然知道有两种,但是其实不是很明白其中原理,经过自己的查阅今天就来记录一些
一下内容 大部分来自 公众号 小林coding 这个人讲的很不错 大家可以去看下
然后我就自己总结一下
进程通信方式
管道
每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。
其实,所谓的管道,就是内核里面的一串缓存。从管道的一段写入的数据,实际上是缓存在内核中的,另一端读取,也就是从内核中读取这段数据。另外,管道传输的数据是无格式的流且大小受限。
我们可以使用 fork
创建子进程,创建的子进程会复制父进程的文件描述符,这样就做到了两个进程各有两个「 fd[0]
与 fd[1]
」,两个进程就可以通过各自的 fd 写入和读取同一个管道文件实现跨进程通信了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FpsYHa0h-1596807988414)(C:\Users\lige\AppData\Roaming\Typora\typora-user-images\1596766346219.png)]
在linux可以通过mkfifo这个命令来创建一个管道或者说 | 也代表一个管道
不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则,不支持 lseek 之类