Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блокировка файла, Несколько процессов 
:(
    Опции темы
deber
Дата 30.11.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 28.2.2006

Репутация: нет
Всего: нет



Ситуация примерно такая:

Код

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


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

ЗЫ Обратите внимание на '&'
PM MAIL   Вверх
arto
Дата 30.11.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



что означает "прекратиться запись"?
PM MAIL ICQ   Вверх
deber
Дата 30.11.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 28.2.2006

Репутация: нет
Всего: нет



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

При этом мне надо чтобы процедура readfile могла читать его сразу. 
Т.е. читает и обновляет до тех пор, пока файл пополняется. Когда все процессы отпадут - конец программы.
PM MAIL   Вверх
arto
Дата 1.12.2007, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



да хоть и "прекратится".
вопрос в том, что считать прекращением записи -- когда процесс умрет, когда процесс не пишет более часа, когда процесс не пишет более суток?
PM MAIL ICQ   Вверх
deber
Дата 3.12.2007, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 28.2.2006

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
arto
Дата 3.12.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



в вашем случае system запускает shell который запускает команду с амперсандом.

следовательно, команда завершается сразу, успешно.
PM MAIL ICQ   Вверх
deber
Дата 3.12.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 28.2.2006

Репутация: нет
Всего: нет



Да, верно.

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

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


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


Это сообщение отредактировал(а) deber - 3.12.2007, 12:53
PM MAIL   Вверх
arto
Дата 3.12.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



кривой.

можно проще -- fork + exec + wait.
PM MAIL ICQ   Вверх
deber
Дата 3.12.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 28.2.2006

Репутация: нет
Всего: нет



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

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

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

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

ЗЫ Прошу прощения, если я плохо объясняю. Рад любой помощи.
PM MAIL   Вверх
arto
Дата 3.12.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



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

папа делает свою работу и изредка проверяет сигнал от ребенка.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1108 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.