Я записываю некоторые записи в файл 100 с регулярным интервалом в 1 и 2 секунды, используя системный вызов записи Linux.файл открыт с помощью:
LogFile = open(fileBuff, O_CREAT | O_RDWR | N_IRUSR | N_IWUSR | N_IXUSR);
Когда я читаю журналы из файла, между ними пропадают некоторые журналы.
Предполагается, что мое значение начинается с 1 и продолжает увеличиваться, поэтому, когда я читаю его 880, 881, 0, 0, 0 ,0 ,0, 887
Пропущенные записи '0'иногда больше.
- Я пытался использовать fsync для сброса даты в файл,
- Добавил правильные блокировки семафоров и выпустил
- Вместо открытия и закрытияфайл каждый раз, я пытался сохранить весь дескриптор глобально и открывать файлы один раз, закрывая только после завершения приложения
Это не настоящий код, но именно это я и делаю.saveRecordToFile вызывается из read_queue.в очереди Максимальный размер счета равен 3000.
void saveRecordToFile(int fid, int writeindex, char *buff)
{
int LogFile = fid, Curpos = 0;
semaCapture(&LogSema);
lseek(LogFile,0,SEEK_SET);
if((num_bytes = write(LogFile,&(writeindex),sizeof(long))) != -1)
{
if((num_bytes = write(LogFile,&(read_index),sizeof(long)) == -1))
{
LogMessage(LOG_ERROR, "Log read index Write failed, read_index:%d, num_bytes:%d, reason:%s \n",
read_index, num_bytes, strerror(errno));
}
}
Curpos = (((writeindex) * sizeof(LogRecord)) + (2* sizeof(long)) + sizeof(PropertiesToSave));
lseek(LogFile,Curpos,SEEK_SET);
if((num_bytes = write(LogFile,bp,sizeof(LogRecord))) == -1)
{
LogMessage(LOG_ERROR, "LogRecord writing failed, num_bytes:%d, reson:%s\n",
num_bytes, strerror(errno));
}
LogFile = -1;
semaRelease(&LogSema);
}
Какие меры можно предпринять, чтобы избежать пропущенных записей?