Linux:长时间运行2-3天后,写入操作无法更新文件

时间:2019-01-24 12:09:54

标签: c linux

我正在使用Linux写入系统调用以1-2秒的固定间隔将一些记录写入100个文件。
使用

打开文件
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. 我没有每次都打开和关闭文件,而是尝试全局保留所有描述符并一次打开文件,仅在应用程序终止时关闭

这不是实际的代码,但这正是我在做的。 从read_queue调用saveRecordToFile。 队列最大计数大小为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);
}

可以采取哪些措施来避免遗漏写信?

0 个答案:

没有答案