Linux: запись не смогла обновить файл через 2-3 дня - PullRequest
0 голосов
/ 24 января 2019

Я записываю некоторые записи в файл 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'иногда больше.

  1. Я пытался использовать fsync для сброса даты в файл,
  2. Добавил правильные блокировки семафоров и выпустил
  3. Вместо открытия и закрытияфайл каждый раз, я пытался сохранить весь дескриптор глобально и открывать файлы один раз, закрывая только после завершения приложения

Это не настоящий код, но именно это я и делаю.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);
}

Какие меры можно предпринять, чтобы избежать пропущенных записей?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...