【Unix】进程间通信
来源:互联网 发布:人工智能软件下载 编辑:程序博客网 时间:2024/03/29 08:58
一、进程间通信的几种技术
管道(半双工)、FIFOs(命名管道)
流管道(全双工)、命名流管道
消息队列、信号量、共享存储
套接口、流 --可支持不同主机上的各个进程间IPC
二、共享存储
1、共享存储允许两个或多个进程共享一给定的存储区。
2、因为数据不需要在客户机和服务器之间复制,所以这是最快的一种IPC。
3、使用共享存储的唯一窍门是多个进程之间对一给定存储区的同步存取,通常,信号量被用来实现对共享存储存取的同步。
4、内核为每个共享存储段设置了一个shmid_ds结构。
5、shmget函数,获得一个共享存储标识符
6、shmctl函数对共享存储段执行多种操作
7、一旦创建了一个共享存储段,进程就可以调用shmat将其连接到它的地址空间中。
8、当对共享存储段的操作已经结束时,则调用shmdt脱接该段。注意:这并不从系统中删除其标识符以及其数据结构。该标识符依然存在,
直至某个进程调用shmctl特地删除它。
三、mmap
1、mmap函数把一个文件或一个POSIX共享内存区对象映射到调用进程的地址空间。使用此函数有三个目的:
使用普通文件以提供内存映射IO
使用特殊文件以提供匿名内存映射
使用shm_open以提供无亲缘关系进程间的Posix共享内存区
2、父子进程之间共享内存区的方法之一是:父进程在调用fork前先制定MAP_sHARED调用mmap。
3、为从某个进程的地址空间删除一个映射关系,我们调用munmap。
4、有时候我们希望确信硬盘上的文件内容与内存映射区中的内容一致,可以调用msync。
5、mmap的另一个用途是在无亲缘关系的进程间提供共享的内存区。
四、父子进程间的共享内存区的例子
使用内存映射文件
使用4.4BSD匿名内存映射
使用/dev/zero匿名内存映射
五、无亲缘关系进程间共享内存
1、Posix.1提供了无亲缘关系进程间共享内存区的两种方法:
内存映射文件:由open函数打开,由mmap函数进行映射
共享内存区对象:由shm_open打开一个Posix.1IPC名字,所返回的描述字游mmap函数映射到当前进程的地址空间。
2、Posix共享内存区涉及的两个步骤要求:
指定一个名字参数调用shm_open,以创建一个新的共享内存区对象或打开一个已存在的共享内存区对象
调用mmap把这个共享内存区映射到调用进程的地址空间。
3、shm_unlink函数删除一个共享内存区对象的名字。
4、处理mmap的时候,普通文件或共享内存区对象的大小都可以通过调用ftruncate修改。
5、当打开一个已存在的共享内存区对象时,我们可调用fstat来获取有关该对象的信息。
六、总结
共享内存利用了虚拟存储器的实现,可以更加方便快速的对文件进行操作,同时也做到了各个进程的数据共享,不管在Windows还是
在Unix上,都是使用最广泛,最为快速的进程间通信方式。
- 【Unix】进程间通信
- Unix-进程间通信
- 【UNIX】进程间通信
- Unix环境进程间通信
- Unix IPC进程间通信
- UNIX SOCKET 进程间通信
- Unix IPC进程间通信
- Unix IPC进程间通信
- Unix socket进程间通信
- unix中的进程间通信
- Unix进程间通信编程经验总结
- Unix环境进程间通信(一)
- Unix环境进程间通信(二)
- UNIX 进程间通信有几种方式?
- UNIX 进程间的通信--IPC
- Unix Linux进程间通信方式
- 进程间通信之 Unix Domain Socket
- 进程间通信的例子: socket unix
- 不按F8进安全模式的方法
- stdafx.h 包含的头文件出错,导致大问题.
- LoadRunner性能测试
- PL/SQL 取得删除纪录的条数
- 必须掌握的八个DOS命令
- 【Unix】进程间通信
- 迷路在胡同
- 迷路的灵魂
- 用MFC写了个贪吃蛇
- 获得汉字拼音首字母
- 22个所见即所得在线 Web 编辑器
- JPA调用存储过程
- php static 关键字
- How do I get multiple process to log to the same file?