Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4263411
  • 博文数量: 776
  • 博客积分: 13014
  • 博客等级: 上将
  • 技术积分: 10391
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-22 17:00
文章分类

全部博文(776)

文章存档

2015年(55)

2014年(43)

2013年(147)

2012年(20)

2011年(82)

2010年(429)

分类: LINUX

2011-05-07 09:06:38


几种方式:

文件、管道、共享内存空间:

1.文件方式的进程通信就是通过读写同一个文件来完成共享数据。一个进程将数据写入文件,另一个进程再将数据从文件中读出。
客户端能够读取文件,且能够多个客户端同时读取,系统允许同时打开一个文件。
服务器端通过清空重写的方式对文件内容进行修改
问题:不能避免在文件尚未进行完写操作时就有进程读取文件内容,这时会造成读取的文件内容为空或者是读出文件中的部分数据。

解决方案:可以通过文件锁的方式进行控制。


2.命名管道:常规的管道只能连接相关进程,由进程创建并由最后一个进程关闭。而命名管道可以连接不相关的进程。它是个FIFO先进先出队列,即使没有进程,命名管道依然可以存在,它不依赖于进程。服务器将字节写入队列,客户端从队列头部移出字节。服务器必须重写数据。它没有竞争的问题,在没有超过管道最大长度的时候,read和write都是原子操作,先将管道清空,然后再将管道写满,在读者和写者联通之前系统内核将进程挂起。

3.共享内存段:不依赖于进程的存在而存在。共享内存段拥有权限系统来控制进程各自的访问权限。多个客户端都可以同时从内存中读数据。

问题:如果读取是在服务器向内存中写数据的时候进行的,有可能既读到旧数据又读到新数据。

解决方案:信号量机制。


比较:

1.文件和命名管道消耗操作多。

2.文件和共享内存是无连接的

3.命名管道和共享内存只能在本机中使用

4.使用共享内存和文件要比使用管道麻烦,要处理竞态

阅读(4967) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~