Имеем:
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).