5、进程间有哪些通信方式【高频】
-
管道:
-
对于匿名管道:
- 匿名管道是一个单向的字节流,两端分别对应一个文件描述符,分别用来读和写
- 匿名管道 本质就是内核内存中的一段缓冲区,它有文件的特质(可以写、读),但并没有文件实体
- 管道只能在有关系的进程之间使用,如父进程与子进程、兄弟进程。因为这些有关系的进程是共享同一张文件描述符表的,所以它们可以对应同一个管道
-
对于有名管道:
- 有名管道最大的特点就是 以 FIFO文件的形式 保存在磁盘上,关联着一个路径名。当进程退出之后,FIFO文件依然保存在文件系统中
- 操作 FIFO文件和 操作一个普通文件是完全一样的(open、close、read、write),且只要两个进程都获取了这个路径,就可以用这个有名管道来通信。所以 没有关系的两个进程 也可以使用有名管道来通信
- 虽然有名管道 有FIFO文件,但这个文件里面是没有内容的。有名管道的内容依然还是存储在内存中,即内核内存中的一段缓冲区
-
-
内存映射:
-
内存映射可以把磁盘上文件的内容,映射到内存上。这样我们可以通过 修改内存上的内容 来修改磁盘文件。当我们 修改内存上的内容,系统会自动帮我们 同步到磁盘中,所以效率很高
-
两个进程里 打开同一个磁盘文件,并分别创建内存映射区,也就是总共由两个内存映射区
-
它们各自通过在内存映射区上修改,来修改磁盘文件的内容,进而通过磁盘文件实现进程间的通信
-
磁盘文件的大小必须>0,不能是空的
-
-
匿名映射
- 与内存映射(文件映射)不同,匿名映射没有文件实体,所以只能用于 有关系的进程之间的通信
-
信号:
- 用于 发送通知 到进程,告知它发生了某种事件或条件
-
共享内存:
- 效率最高的进程通信方式,没有之一
- 共享内存就是 多个进程 共享同一块内存段,一个进程在 共享内存段里面写入,其他的进程都可用查看到。这个共享内存段 位于 进程的用户区,所以不太需要 内核的干涉,从而大大提高效率(比如 管道 就需要把 数据传入内核中的缓冲区,里面涉及两次 内核 和 用户区的切换,从而导致效率降低)
-
Socket套接字:
- 支持TCP/IP 网络通信 元,主要用于在 客户端 和 服务器 之间 通过网络 进行通信
- socket本质上也是一个文件,有自己的fd。我们就是通过 fd 向一端的socket中写入数据(写缓冲区),然后在另一端的socket中读取数据(读缓冲区)