параллельная обработка данных

tz-lom

Продвинутый новичок
Если после форка закрываются все дескрипторы, то это баг. После форка все дескрипторы должны дублироваться.
с чего бы вдруг?
дескриптор это число, и даже если ОС будет смотреть на таблицу дескрипторов связанных с процессом и дублировать их, то как потом определить какие числа в памяти нужно менять,а какие нет?
 

whirlwind

TDD infected, paranoid
tz-lom форк - это ветвление процесса. После форка получаются два идентичных адресных пространства данных и кода. Не путайте процессы и потоки.

PS. Инструкция как правильно форкаться:

1. Вызвать fork
2. В новом процессе вызвать setsid для отсоединения от родительской группы процессов (то же самое, что отсоединиться от консоли)
3. Закрыть дескрипторы в родительском процессе, exit

Если нужно контролировать завершение чилда, то следует использовать обработчик на сигнал CHLD. Факт работы или завершения чилда можно проверить kill с нулевым значением сигнала. Что бы не плодить зомби, чилдов надо вычищать через waitpid.

Более подробно про UNIX IPC разжевано здесь http://prolib.ru/unix-ipc
 

tz-lom

Продвинутый новичок
whirlwind
согласен,я неправ
хотя не раз натыкался на заметки что после форка PHP закрывает соединения с БД после остановки первого процесса, наверное это что то в протоколе MySQL или его реализации в РНР
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
whirlwind это не баг, это фича
ты не можешь сказать php "не обращать внимания на это соединение с базой, открытое в родителе, не закрывать его при завершении"
 

whirlwind

TDD infected, paranoid
grigoriВряд ли это может быть причиной. Причина может быть на уровне протокола mysql, если там есть привязка к pid открывшего соединение. Пайпы, сокеты, файлы, I/O потоки - в посиксе это одно и то же. После форка все дескрипторы дублируются. Проверить просто: форк и закрытие STDOUT, после чего в чилде запись в STDOUT - все будет прекрасно работать.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
щас проверю, останется ли ресурс к файлу на диске рабочим, если его закрыть в дочке
в mysql должна быть привязка потока к соединению - это видно из process list (один поток на каждое соединение)
 
Сверху