cнова форк

NullPointer

Новичок
cнова форк

скрипт-демон (while(true) {./*pcntl_fork тута*/..})

внутри форкаю скрипт
в чилде меняю глобальные переменые(точнее конфы, кот задаются до цикла)
в конце кода чилда делаю exit();(т.е. убиваю его), и в паренте, всё что я наменял в чилде, не видно( как будто чилд похерил это вместе со своей смертью(

как быть?
 

NullPointer

Новичок
точнее я не доконца знаю как он работает)

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

algo

To the stars!
Все переменные дочернего процесса живут отдельной жизнью... Это отдельный процесс, вообще..

Меняй что хочу, родителя это не касается.

P.S не очень понял, что ты хочешь получить, т.е пред. мессагу
 

NullPointer

Новичок
понял, но а как их передать родителю?
RE: PS::

код типа
Код:
if ($_GET['act']=='a') msg("action a");
if ($_GET['act']=='b') msg("action b");
msg("no action or bad action");
...
криво, но что есть...
просто есть уже готовый код, хочу его демонизировать, раньше код работал адекватно при вызове msg(), т.е. завершался на первом же вызове, теперь же - он вызовится 2 раза(при $_GET['act']=a||b)
 

algo

To the stars!
Передать можешь статус возврата. Остальное - это меж-процессная коммуникация, вряд ли оно тебе реально надо...

System V функции для этого полезны, очереди сообщений и т.п.
 

hermit_refined

Отшельник
я правильно понимаю, что для того, чтобы закрыть сокет, вы создаете ещё один процесс, который потом убивается?
а просто закрыть - не катит?..
 

NullPointer

Новичок
то есть если делать без форка- и если в конце msg() будет exit() то убивается весь демон(((

думал ещё над вариантом типа goto, но кроме патча ничего не нашёл
 

hermit_refined

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

NullPointer

Новичок
код не мой, онлайн игра, которая была скачана из нета, грузила сервер ппц как(каждое обновление читала, писала файл в 300кб)

Амулет дракона(WAP), может слышали
 

hermit_refined

Отшельник
ох...
1. попробовать по-человечески - заменить exit на выброс исключения, поймать его, и не забыть удалить весь появившийся глобальный мусор.
но если скрипт очень кривой, занимаемая память может все равно быстро расти.
2. по-дурному (fork). один из самых простых вариантов - передавать через named pipe ([m]posix_mkfifo[/m]).
наример, делать запись либо перед exit, либо - если не отлавливается - через [m]register_shutdown_function[/m].
+ [m]serialize[/m]/[m]unserialize[/m].
 

NullPointer

Новичок
вот вот, сериалайз та и вешает сервер из дефолтного движка, т.к. там игровой массив сначала сериалайзится, потом записывается в файл
а я хотел не делать этого, чтобы массив висел всё время в памяти, и иж изредка делался бекап

mkfifo- не хотелось бы вообще чего либо писать на диск(

-~{}~ 26.03.07 01:10:

уже подумываю переписать игру
и раз уж буду переписывать- то либо жаба либо Си(клиент на пхп)
 

hermit_refined

Отшельник
mkfifo- не хотелось бы вообще чего либо писать на диск
а с чего вы взяли, что данные будут писаться на диск?..
а я хотел не делать этого, чтобы массив висел всё время в памяти, и иж изредка делался бекап
мне понятно из этого только одно - вы сами плохо понимаете, что нужно делать, что оптимизировать и как именно.
хотите в слепую тыкаться - ok, только хватит глупости спрашивать.
мы-то тем более в ваших драконах ни бум-бум.

P.S. как обычно, исходный вопрос ничего общего с исходной проблемой не имел. как они надоели...
 

NullPointer

Новичок
я у вас спросил одно- вы на это мне ответа не дали, а начали говорить какой я нуб и ничего не понимаю(да это проще чем объяснить как передавать данные между потоками, согласен)
 

hermit_refined

Отшельник
NullPointer
1. вам это не нужно. вы изначально занимаетесь дурью, не знаете причину нагрузки, и занимаетесь ошибочной оптимизацией.
2. я изложил вам тот способ, который вы в состоянии адекватно понять. но в силу п.1 - зря.
 

NullPointer

Новичок
ну-ну я смотрю вы 2 года вели проект амулет дракона и хорошо знаете что создаёт нагрузку.
 
Сверху