root 事情起因: 程序在收到深度行情回报时候,会将深度行情结构体变成字符串string然后用ofstream输出到文件,使用endl强行刷新缓冲;同时在redis的key上进行list append操作 在模拟盘测试时,一切记录正常;但是切换到实盘行情时,redis服务器的记录正常,但文件记录并不正常。 问题分析 接入实盘行情后,需要订阅多个行情tcp接口,之前在模拟盘时候只需要订阅一个,猜测可能是因此造成 仔细观察程序结构,发现在每次订阅连接登录后,都是新建了一个子进程。 而在自己定义的市场类中,每次登录成功都会重新初始化文件ofstream指针。因此原因可能是同一个文件只能被一个子进程中的指针所拥有(但是redis可以有很多个子客户端),因此现在文件的管理权在最后的一个端口对应的子进程中。 但是CTP会自动选择速度最快的一个子进程进行市场数据回报,造成了文件管理子进程和数据回报子进程不一致。导致行情记录文件为空,但是redis服务器记录正常 问题解决 有两个方案可供解决 1. 在连接行情之前,自己写程序去测试每个端口速度,然后只连接速度最快的端口 2. 登陆成功回报时不初始化文件指针,只在收到行情数据时判断当前子进程是否拥有文件管理权限(利用is_open()方法)。如果没有,则创建,否则跳过。