Мне нужно следить за модификацией файла в системе на основе Unix, и у меня нет доступа к Boost. Мне интересно, если следующая логика звучит правильно. Я полагаю, что это, вероятно, неэффективно, и я знаю, что теряю кучу циклов, вообще не спя в цикле while, но у меня нет никакой оценки того, как долго файл будет находиться между изменениями, и мне нужно знать, относительно быстро:
std::time_t getTimeLastModified(const char* filename){
struct stat fileattrib;
stat(filename, &fileattrib);
return fileattrib.st_mtime;
}
int main(){
std::time_t file1_modified_time = getTimeLastModified(coor_file.c_str());
while(difftime(getTimeLastModified(coor_file.c_str()),file1_modified_time)==0){}
// If program execution gets here, file has been modified
}
Логика проверки времени мода в основном правильная.
Вам нужно только проверить ошибку, возвращаемое значение stat — в случае, если файл отсутствует.
struct stat fileattrib;
int status = stat(filename, &fileattrib); // Get file stats
if (status < 0)
return((std::time_t)-1); // File missing?
return(fileattrib.st_mtime);
Это будет означать, что вы должны проверить ошибки getTimeLastModified () return
значение.
Если вам случится получить представление о том, как часто вам нужно опрашивать файл
время модификации, вы можете поместить вызов usleep (unsinged long usec) внутри
ваш цикл пока. Вы можете сделать что-то подобное?
const unsigned long polltime = 5000; // 5ms
usleep(polltime);
Другая вещь, чтобы рассмотреть, является ли время ожидания. То есть что ты делаешь
если файл никогда не изменяется — скажем, 10 минут (или 600000000 микросекунд).