Как проверить, был ли файл изменен с помощью другого процесса? - PullRequest
0 голосов
/ 27 декабря 2010

У меня есть два процесса (первый источник в perl, секундный источник в c ++), и оба они используют один и тот же файл. Один из них записывает в файл построчно, а другой читает из файла, если к нему добавляется новая строка. Чтобы второй процесс узнал, что файл изменен, первый процесс сбрасывается после каждой зависимости. Но второй процесс проверяет только время модификации, которое нужно увеличить, чтобы начать чтение, но на самом деле после добавления новой строки и очистки файла не изменяется его «время последней модификации». Так что для этого нужен еще один апораче. Итак, вопрос здесь: как определить, добавлена ​​ли новая строка к файлу, чтобы начать его обработку?

вот фрагменты из исходников этого процесса:

1

open FILE, ">>", $file or die $!;
for($i = 0; $i <= $#ticks; ++$i)
{
  print FILE $ticks[$i]."\n";
  FILE->flush();
  sleep(10);
}
close FILE;

2.

struct stat64 file_info;
if(fstat64(fileno(this->auto_file_ptr.get_file()), &file_info)!=0)
{
//throw error that file have been changed
}
data_file_new_modification_time = 1000LL * file_info.st_mtime;
if(this->data_file_last_modification_time!=data_file_new_modification_time)
{
//processs the file
}

Ответы [ 3 ]

1 голос
/ 27 декабря 2010

Добро пожаловать в программирование на основе событий.

Employ select - вы не хотите знать, когда файл изменяется, но когда доступны новые данные. Этот системный вызов делает именно это.

См. Реализацию в File :: Tail , где приведен пример из реальной жизни со всеми граничными случаями. Передача этого на C должна быть легкой для вас, или используйте libev с select backend.

1 голос
/ 27 декабря 2010

Используйте механизмы IPC для синхронизации вашего C ++ и Perl-приложения. Для этой цели вы можете использовать семафоры или мьютексы.

0 голосов
/ 20 марта 2011

Кажется, что stat64 не меняет своего члена st_mtime, когда файл очищается. Вместо этого st_size меняется. Поэтому я могу использовать st_size, чтобы определить, был ли файл изменен.

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