全部博文(776)
分类: LINUX
2011-05-07 09:06:38
几种方式:
文件、管道、共享内存空间:
1.文件方式的进程通信就是通过读写同一个文件来完成共享数据。一个进程将数据写入文件,另一个进程再将数据从文件中读出。
客户端能够读取文件,且能够多个客户端同时读取,系统允许同时打开一个文件。
服务器端通过清空重写的方式对文件内容进行修改
问题:不能避免在文件尚未进行完写操作时就有进程读取文件内容,这时会造成读取的文件内容为空或者是读出文件中的部分数据。
解决方案:可以通过文件锁的方式进行控制。
2.命名管道:常规的管道只能连接相关进程,由进程创建并由最后一个进程关闭。而命名管道可以连接不相关的进程。它是个FIFO先进先出队列,即使没有进程,命名管道依然可以存在,它不依赖于进程。服务器将字节写入队列,客户端从队列头部移出字节。服务器必须重写数据。它没有竞争的问题,在没有超过管道最大长度的时候,read和write都是原子操作,先将管道清空,然后再将管道写满,在读者和写者联通之前系统内核将进程挂起。
3.共享内存段:不依赖于进程的存在而存在。共享内存段拥有权限系统来控制进程各自的访问权限。多个客户端都可以同时从内存中读数据。
问题:如果读取是在服务器向内存中写数据的时候进行的,有可能既读到旧数据又读到新数据。
解决方案:信号量机制。
比较:
1.文件和命名管道消耗操作多。
2.文件和共享内存是无连接的
3.命名管道和共享内存只能在本机中使用
4.使用共享内存和文件要比使用管道麻烦,要处理竞态