1.现象
车辆接管后再退出出现无法接管,舱端发送任何命令没有反应。
2分析
打开当时的日志查看发现创建asc文件失败,而在不断的发送或者接收CAN数据,导致一直调用写数据到文本的接口,而接口中又在开头判断是否创建文件asc是否成功,而当不成功时候会进入创建文件asc,这样就会有log日志中写入,而CAN实时的在接收数据,而每当接收一条,而此时的创建文件失败,就又会进入创建新的文件接口,而此时又创建失败,这样进入无限的循环,导致vehicle_log文件也会疯狂的增长,而监控vehicle_log文件的任务每100ms监控线程几乎得不到执行,导致在/data/vehicle_log/中的log文件会瞬间增加很多,当时经过打印日志,发现创建文件错误代码显示:TOO many file open 。
当时陈伟哥提示是不是在创建文件时候没有关掉已经打开的文件描述符,后来发现真的没有处理上次打开的文件描述符,真是无语啦。。。。。。。。。。
3结果
在创建asc文件时候没有把上次的文件描述符给关闭掉,导致以后创建不了文件。
改的地方://begin jian 2020.7.28 //end
int createFile(long long recordIndex)
{
memset(pubRecordFile, 0, FILE_NAME_MAX_LEN);
if(pubRecordFile != NULL)
{
//begin jian 2020.7.28
if(lastRecord_fd!=-1)
{
print_log("BLACKBOX begin close lastRecord_fd = %d\r\n",lastRecord_fd);
close(lastRecord_fd);
}
//end
sprintf(pubRecordFile, "%s/%s%lld%s", RECORD_DIR, RECORD_FILE_HEAD, recordIndex, RECORD_FILE_TAIL);
record_fd = open(pubRecordFile,O_WRONLY|O_CREAT, 777);
if(record_fd < 0)
{
print_log("BLACKBOX open %s fail \r\n", pubRecordFile);
if(errno != 0)
{
print_log("open record file fail, errno = %s\n", strerror(errno));
}
return record_fd;
}
print_log("open %s success\r\n", pubRecordFile);
}
else
{
print_log("pubRecordFile is NULL\r\n");
}
return 0;
}