ЗАО «ЗЭО»
Техническая поддержка пользователей => Тион, Тион-Про, Тион-Про v2, Сириус => Тема начата: Shkiper от 29 Сентября, 2011, 13:35:47
-
Добрый день.
Теон-Про v2. На линуксе работает программа, соберающая данные и пишущая их в файлы. Запись ведется постоянно. Со временем кэш забивается и программа виснет.
Использовал очистку кэша после закрытия очередного файла и перед созданием следующего, но тогда через небольшой промежуток веремени прекращают создаваться новые файлы. При проверке програмно свободного места (fstatvfs()) линукс утверждает, что нет свободного места. А оно есть.
Влияет ил очистка кэша на определение свободного пространства и, вообще, может ли очистка кэша повлиять на создание нового файла?
-
> линукс утверждает, что нет свободного места. А оно есть.
Как вы это определяете?
Нужен пример программы, на котором можно будет повторить/наблюдать эту проблему.
-
Все программу прислать не смогу.
Вот выдержки из модуля сохранения:
....
void saveModule::createNewADCFile(quint16 _depthRecursion) // Создание нового файла
{
if(_depthRecursion > 100)
{
fdADC = -1;
emit RegistrationChange();
}
char* filePath = ((tr("%1/%2/%3.csv").arg(mountPoint).arg(ReportName).arg(fADCcounter))).toLocal8Bit().data(); //адрес файла
bool fileExists = QFile::exists(QString(filePath));
fdADC = -1; //Файловый дескриптор для порта
//открыть порт
fdADC = open(filePath, O_WRONLY | O_CREAT | O_APPEND , S_IRWXU);
// дальше идет НЕ говнокод. нужно просто призадуматься...
// хотя нет, все-таки говнокод
if ((fdADC == -1))
{
if(externalDev)
{
mountPoint = SYSREPORTPATH;
externalDev = false;
}
if (createDirTree(mountPoint, ReportName))
{
fADCcounter++;
saveADCCounter();
createNewADCFile(_depthRecursion+1);
}
else
{
emit RegistrationChange();
}
}
else
{
if (!fileExists)
{
printfADCHead();
fdatasync(fdADC);
}
emit RegistrationChange();
}
ChannelCount = 0;
OneLine = tr("");
}
void saveModule::closeADCFile(void) // Закрытие файла
{
fdatasync(fdADC);
close(fdADC);
sync();//<<
system(QString("echo \"1\" > /proc/sys/vm/drop_caches").toLocal8Bit().data()); //<<
fdADC = -1;
}
.....
int saveModule::getFreeSpacePrc(void) // Проверка и очистка места на диске
{
if (fdADC == -1)
{
return -1;
}
struct statvfs diskFree; //<<
fstatvfs (fdADC, &diskFree);
int free = int(diskFree.f_bavail); //<<
int total = int(diskFree.f_blocks);
int Prc = (free * 100) / total;
///Удаляем старые файлы и отчеты, при заполнении внутренней памяти
if ((Prc < 5) && (!externalDev))
{
QDir reportPath(SYSREPORTPATH);
QStringList allRepots = reportPath.entryList(QDir::Dirs|QDir::NoDotAndDotDot,QDir::Time|QDir::Reversed);
QStringList allFilesInReport;
if (allRepots.count() > 0)
do {
reportPath.cd("./" + allRepots.at(0));
allFilesInReport = reportPath.entryList(QDir::Files|QDir::NoDotAndDotDot,QDir::Time|QDir::Reversed);
if(allFilesInReport.count() > 0)
{
QFile(reportPath.path() + "/" + allFilesInReport.at(0)).remove();
allFilesInReport.removeFirst();
}
reportPath.cdUp();
if(allFilesInReport.count() == 0)
{
reportPath.rmdir(allRepots.at(0));
allRepots.removeFirst();
}
fstatvfs(fdADC, &diskFree); //<<
free = int(diskFree.f_bavail); //<<
total = int(diskFree.f_blocks);
Prc = (free*100)/total;
} while ((Prc < 5) && (allRepots.count() > 0)); //Пока пямять занята и еще есть, что удалять
}
if (Prc > 100) return -1;
return Prc;
}
-
> говнокод
Вся программа не нужна, сделайте, пожалуйста, файл исходного кода тестовой программы, чтобы я и вы могли эту тестовую программу запустить и набдлюдать указанную проблему.