免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 9666 | 回复: 22
打印 上一主题 下一主题

[C] 父子进程间共享数据的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-17 16:53 |只看该作者 |倒序浏览
30可用积分
父进程初始化时,通过fork,execlp开启一个子进程。

父进程处于无限循环状态,当有连接请求进来时,开始工作,记录连接的一些信息(连接并发会很高),所以准备先存放到内存中,然后子进程每隔一段时间读取一次这个内存,把数据写入文件,然后清除。

不知道用什么方式实现,管道(非阻塞)、共享内存、mmap、、、、?

请指点一下,最好有代码示例!

最佳答案

查看完整内容

用system V共享内存,用信号灯来实现互斥。可以申请两块共享内存,一块读一块写,当写满了时,再切换到另一块写。这样速度会很快,同时可以设置一个超时参数,当写执行到一定时间后,切换到另一块内存。防止父进程阻塞在某个函数上,而不释放写的信号灯。相关资料可以参考UNP v2,里面system V共享内存这章有比较详细的介绍,这是一中双缓冲机制,效率非常高。

论坛徽章:
0
2 [报告]
发表于 2008-06-17 16:53 |只看该作者

回复 #1 veking 的帖子

用system V共享内存,用信号灯来实现互斥。
可以申请两块共享内存,一块读一块写,当写满了时,再切换到另一块写。这样速度会很快,同时可以设置一个超时参数,当写执行到一定时间后,切换到另一块内存。防止父进程阻塞在某个函数上,而不释放写的信号灯。

相关资料可以参考UNP v2,里面system V共享内存这章有比较详细的介绍,这是一中双缓冲机制,效率非常高。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2008-06-17 16:59 |只看该作者
呵呵,感觉你说的几种方式都可以。只是各有各的用法。

论坛徽章:
0
4 [报告]
发表于 2008-06-17 17:02 |只看该作者
能详细说说吗?

论坛徽章:
0
5 [报告]
发表于 2008-06-17 17:08 |只看该作者
APUE和UNPv2

论坛徽章:
0
6 [报告]
发表于 2008-06-17 17:08 |只看该作者
原帖由 veking 于 2008-6-17 17:02 发表
能详细说说吗?

看APUE好了,上面都有实例的了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2008-06-17 17:10 |只看该作者
这个我也没有具体做过。但是mmap的方式应该用不上吧。本身父子进程之间就有数据共享的。
LZ可以了解一下管道的使用方法。可以作为你的参考。

BTW,最笨的方式,父进程把这些东西写到文件里,子进程读取可以么?

论坛徽章:
0
8 [报告]
发表于 2008-06-17 17:12 |只看该作者
FIFO也是可以的

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
9 [报告]
发表于 2008-06-17 17:21 |只看该作者
原帖由 ruoyisiyu 于 2008-6-17 17:12 发表
FIFO也是可以的


对,应该也是可以的。建议楼主看一下APUE中的相关章节,或者网络编程中关于管道等的实例。应该会有所帮助的。

论坛徽章:
0
10 [报告]
发表于 2008-06-17 17:31 |只看该作者
那么那种性能更好呢?

父进程写数据可能会非常快,子进程能来得及读取吗?  
这个问题一直都没想明白。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP