Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Блокировка файла


Автор: deber 30.11.2007, 17:26
Ситуация примерно такая:

Код

create(tempfile);
system("prog1 >> tempfile &");
system("prog2 >> tempfile &");
readfile();


readfile() постоянно читает данный файл. Мне нужно знать когда во временный файл прекратиться запись.
Как это сделать наиболее хорошим способом?  smile 

ЗЫ Обратите внимание на '&'

Автор: arto 30.11.2007, 17:44
что означает "прекратиться запись"?

Автор: deber 30.11.2007, 18:19
Сори, ошибся, конечно прекратится. Т.е. когда процессы перестанут писать в него что-либо.

При этом мне надо чтобы процедура readfile могла читать его сразу. 
Т.е. читает и обновляет до тех пор, пока файл пополняется. Когда все процессы отпадут - конец программы.

Автор: arto 1.12.2007, 08:21
да хоть и "прекратится".
вопрос в том, что считать прекращением записи -- когда процесс умрет, когда процесс не пишет более часа, когда процесс не пишет более суток?

Автор: deber 3.12.2007, 08:42
Хорошо, по другому.
Можно ли определить завершились ли все system'ы?

Автор: arto 3.12.2007, 11:38
в вашем случае system запускает shell который запускает команду с амперсандом.

следовательно, команда завершается сразу, успешно.

Автор: deber 3.12.2007, 12:52
Да, верно.

Вот придумал кривой вариант, но что-то сомнения какие-то:

main.pl:
Код

Создаем временный файл по шаблону "file-XXXXXX" (далее tempfile).
Запускаем system("prog1 tempfile >> tempfile &");
Запускаем system("prog2 tempfile >> tempfile &");
readfile();

sub readfile {
   my used=1;
   while (used) {
      Смотрим наличие файлов tempfile.used*
      Если файлов нет, то used = 0;
      Читаем то, что уже есть в файле и обрабатываем.
   }
}


prog1.pl:
Код

my tempfile = shift;
Создаем временный файл по шаблону "$tempfile.usedXXX"
Делаем свое дело
Удаляем временный файл.


prog2.pl ... progN.pl - аналогичные по структуре prog1.pl


Насколько это кривой вариант?

Автор: arto 3.12.2007, 13:39
кривой.

можно проще -- fork + exec + wait.

Автор: deber 3.12.2007, 14:06
Боюсь wait в данном случае не прокатит. Он блокирующий.
А мне нужно работать с файлом когда еще идет запись, а не когда она закончится. Когда закончится, мне он уже не нужен.

Т.е. если первый процесс записывает в файл такие строки:
1
2
3
4

А второй записывает такие:
a
b
c
d

Таким образом, если процессы успели записать только "1, 2, 3". То мне нужно получить эти строки.
При следующем запросе я хочу увидеть больше, например: "1, 2, 3, 4, a, b".
А когда процессы отвалятся я увижу полную картину и тоже хочу отвалиться.

ЗЫ Прошу прощения, если я плохо объясняю. Рад любой помощи.

Автор: arto 3.12.2007, 14:46
тогда не wait, а pipe, или любой другой ipc, в детях не exec, а тот-же system, но без &, и посылка папе какого-либо сигнала по ipc.

папа делает свою работу и изредка проверяет сигнал от ребенка.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)