博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

IPC通信方法

Posted on 2016-03-22 18:05  bw_0927  阅读(297)  评论(0)    收藏  举报

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()