http://www.zyfforlinux.cc/2014/10/19/IPC%E9%80%9A%E4%BF%A1%E6%9C%BA%E5%88%B6/
IPC通信机制概括
-
基于文件的
- 无序文件: 文件映射
- 有序文件: 管道文件 有名/匿名 socket文件
-
基于内存
- 无序内存: 共享内存
- 有序内存: 共享队列(消息队列)
- 信号
利用信号实现IPC通信这里不再详述,可以参考我的信号详解(上/下).
本篇文章主要讲述基于文件的和基于内存的IPC通信机制
------基于文件的通信机制
无序文件
无序文件来进行进程间通信主要有两种方式:
-
利用文件进行read/write来实现进程通信
主要是针对不同进程而言的进程通信,但是不可避免带来的是进程之间的竞态。
如果服务器通过清空内容再重写的方法来更新文件,如果某个客户恰好在清空和重写之间读取文件
那么它得到的将是一个空的或者只有部分内容
这里就不举例子来说明通过文件来实现的进程通信了。 -
利用文件的mmap映射实现进程通信
主要是针对父子进程来说的,子进程克隆父进程整个内存区域,但内存区域的指向不同的物理内存空间
尽管克隆,但内存独立。不能相互访问。mmap映射可以实现进程间内存数据共享
MAP_SHARED:映射到同一个物理内存
MAP_PRIVATE:映射到不同的物理内存
有序文件
有序文件实现进程间通信的话主要利用的就是管道来实现,管道的话分为有名管道和匿名管道。有名管道和匿名管道的区别主要在于
作用的对象。
- 有名管道
主要用于实现不同进程之间的通信,一端写,一端读,没有数据的时候读就会阻塞,直到数据到来,多个进程读的话,也可以避免竞态条件。
管道其本质只是一个内核对象。有名管道其本质是希望可以通过文件名来找到内核对象,当管道在使用的时候,可以删除管道文件,管道文件的用途仅仅是用于找到管道内核对象。创建有名管道的方法就是mkfifo。 - 无名管道
无名管道不需要创建管道文件,只能用于父子进程之间的管道通信,通过pipe系统调用来创建,调用pipe后会生成两个fd,一个fd0用于从管道中读数据,一个fd1用于从管道中写数据。 - socket文件
域套接字
-----基于内存的通信机制
- 共享内存
ipcs
shmget()
- 消息队列
msgsnd()
注意区别于域套接字的sendmsg()