0

进程间共享数据技术

| |
2009/03/02    13:47    2168    huzhangyou2002 Windows CE » Linux 不指定
进程间共享数据技术是每个操作系统都具有的特性,而每个操作系统都会略有不同,而思路方面都是一致的。经过整理,各操作系统进程间共享数据技术存在以下四种方法
1:管道数据
2:Socket数据
3:共享内存
4:文件方式
之前广州某项目曾经考虑过使用管道实现,当然后来考虑到压力并不是很大,就改用文件方式处理了。Socket数据就比较直接了,同正常的网络socket一致。共享内存技术是本文的一个重点介绍的内容。文件方式不外乎直接性质的文件写读操作,或者通过数据库的方式进行读写。

本文就Linux下面共享内存技术进行探讨,因为共享内存是进程间共享数据最快的方式。

Linux共享内存有两种模式(见参考文献 1,2):

mmap方法和shm方式。

这里具体说一下shm方式:

要使用共享内存,应该有如下步骤(见参考文献3):
引用

1.开辟一块共享内存 shmget()
2.允许本进程使用共某块共享内存 shmat()
3.写入/读出
4.禁止本进程使用这块共享内存 shmdt()
5.删除这块共享内存 shmctl()或者命令行下ipcrm


参考文献三中提到在使用shm方式的一些注意事项:

1:在使用 函数shmget的时候有一个key_t参数,我们可以使用


生成shmkey参数。

使用shm方式共享内存需要用到如下头文件:


相关函数:



参考文献四《共享内存的系统调用》提到:

例1. 创建关键字为0x1234,访问权限为0666,占用空间10K的共享内存,如果已存在则返回其标识号。

例2. 创建关键字为0x1234,访问权限为0666,占用空间10K的共享内存,如果已存在则报错。

例3. 将创建关键字为0x1234,占用空间10K的共享内存,链接到进程中。

例4. 释放进程中地址paddr处的共享内存映射。



经过整理:可以写出如下类代码:


当然要完善,还要加上锁机制之类的。

在经典数据Unix网络编程卷二中有如下例子非常详细明显的使用信号量来互斥进程间数据的程序,本文根据连接 http://blog.chinaunix.net/u/22935/showart_298945.html 摘录如下:

服务器端程序:


客户端程序:



程序开辟共享内存后,容易造成一些问题就是下次创建的时候会报错17,表示EEXIST.

可以使用以下方法进行删除:

获取到该共享内存的ID,然后删除ipc


附上下载来的一个资料,关于进程管理的书籍:


参考文献:
1:Linux环境进程间通信(五): 共享内存(上)
2:Linux环境进程间通信(五): 共享内存(下)
3:共享内存---shmget shmat shmdt
4:14.2.1 共享内存的系统调用
Tags: , , , , , | 引用(0)
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]