URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4824
[ Назад ]

Исходное сообщение
"Связать два и более процессов FIFO/pipe ? На perl"

Отправлено exec , 07-Ноя-05 21:24 
Имеем:
1. Есть cgi скрипт которому дают то, что нужно скинуть в табличку бд MySQL;
2. Есть несколько процессов fork()-нутых которые берут данные из таблички бд MySQL и передают зацепленным к ним клиентам;

Суть задачи:
Необходимо сделать некий обходной канал, по которому cgi скрипт может сообщить fork()-нутым процессам, что поступили новые данные.

Упрощённо, сейчас в коде всё выглядит так:

#--- ST --- fork()-нутый процесс -------
$inital_id=0;
while (1){
$inital_id=&SkazocnikDlaKlienta($inital_id);
sleep(10);
} # while (1)

sub SkazocnikDlaKlienta(){
$last_id=$_[0];
# >>> здесь бы проверить есть ли данные ещё не обращаясь к БД, а то обращений на деле очень много и муторных, если данных нет то просто пропустить выборку данных
$s="SELECT id,glawata FROM glawtable WHERE id>$last_id ORDER BY id";
$strez = $rez=$dbh->Query($s);
if ($strez !=0){
$fn=1;
for ($n=0; $fn ==1; $n++){
($i_id, $i_glawata)=$rez->FetchRow;
if ($i_id >0){
$last_id=$i_id;
print "$i_glawata\n"; # условно (здесь выдать данные клиенту)
}else{$fn=0;}
} # for ($n=0; $fn ==1; $n++)
} # if ($strez !=0)
return $last_id;
} # sub SkazocnikDlaKlienta()
#--- EN --- fork()-нутый процесс -------

#--- ST --- добавлятор в cgi -------
sub AddData(){
$inglawdata=$_[0];
$save_data=$dbh->quote($inglawdata);
$s="INSERT INTO glawtable VALUES ('', $save_data)";
if ($dbh->Query($s) !=0){
# >>> в этом месте нужно как-то передать всем форкнутым процессам что данные поступили
} # if ($dbh->Query($s) !=0)
} # sub AddData()
#--- EN --- добавлятор в cgi -------

Конечно, самое замечательное было бы, это не просто не просто сказать форкнутому процессу о поступивших данных, а приказать независимо от его внутреннего цикла выполнить сабу "SkazocnikDlaKlienta()".

Дополнительно:
cgi-шник понятия не имеет есть ли в памати fork()-нутые процессы, на какой они сейчас стадии своего цикла, сколько их в данный момент, и они не его потомки.
Он может знать только то, что я в него прописал (имена таблиц, файлов, и т.п.)


Господа, прошу вашего совета как реализовать связь между процессами в свете изложенного выше?
Прошу дать урывки кода, показать исходники, или подсказать ключевые слова по которым искать.
Важно: что бы это не сильно нагружало процессор, не насиловало диски ([открыть файлы]/[открыть tcp/udp порт (т.е. дыру)] не предлагать).
Если бы это был старый добрый DOS и старый добрый ASM, то сделал бы всё на прерываниях (int XX).


Содержание

Сообщения в этом обсуждении
"Связать два и более процессов FIFO/pipe ? На perl"
Отправлено ACCA , 08-Ноя-05 09:02 
Хоть бы слово про систему сказал, мы бы сориентировались...

man perlipc

Перецепи CGI с БД на сервер приложения, который

1. Имеет сокет в PF_UNIX
2. Складывает полученное оттуда в БД
3. Рассылает клиентам обновления (через потомков)

О FIFO стал бы думать в последнюю очередь.


"Связать два и более процессов FIFO/pipe ? На perl"
Отправлено exec , 08-Ноя-05 22:17 
>Хоть бы слово про систему сказал, мы бы сориентировались...

Unix-подобные (Линух, Фря...)

Я не сторонник сочетаний windows+интернет в качестве сервера :)