前言
新交易系统中,通过mmap来实现持仓和订单的本地持久化,之前未用过mmap,在本次实现中遇到了一些问题,仅记录Bus error问题;
实现
基本逻辑
OM或者PM在启动时,先通过本地的持久化文件来恢复订单或者持仓:
- 如果是当日的第一次的正常启动,那么是没有持久化文件的,这个时候,PM需要从别的地方来获取初始化的持仓(当天还没有开始交易,没有订单,OM不需要做处理);
- 如果不是当天的第一次正常启动,那么是有持久化文件的,OM或者PM就需要从本地的持久化文件来获取订单和持仓,完成初始化;
问题
持久化是通过mmap映射本地文件来实现的,遇到了Bus error的问题,什么原因呢?
是因为在当天的第一次正常启动时,是没有持久化文件的(对每个策略而言,持久化文件以天为单位来建立并记录的),这时需要先建立持久化文件,然后通过mmap进行映射后再写入记录信息;问题就出在了建立新文件后mmap映射修改,具体原因可以参考:
使用mmap遇到总线错误bus error
发生错误的原因是因为mmap不能去扩展一个内容为空的新文件,因为大小为0,所有本没有与之对应的合法的物理页,不能扩展。
解决
解决方案有2个:
一个就是上面的链接里的方案: 只需要在新创建的空文件中先写入一些数据即可
另外一个是通过ftruncate对新建立的文件进行扩展后再映射修改
int fd = open("/workspace/delete/data.txt", O_RDWR | O_CREAT, 777);
if