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

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

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

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

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

Более подробно про UNIX IPC разжевано здесь http://prolib.ru/unix-ipc
 
whirlwind
согласен,я неправ
хотя не раз натыкался на заметки что после форка PHP закрывает соединения с БД после остановки первого процесса, наверное это что то в протоколе MySQL или его реализации в РНР
 
whirlwind это не баг, это фича
ты не можешь сказать php "не обращать внимания на это соединение с базой, открытое в родителе, не закрывать его при завершении"
 
grigoriВряд ли это может быть причиной. Причина может быть на уровне протокола mysql, если там есть привязка к pid открывшего соединение. Пайпы, сокеты, файлы, I/O потоки - в посиксе это одно и то же. После форка все дескрипторы дублируются. Проверить просто: форк и закрытие STDOUT, после чего в чилде запись в STDOUT - все будет прекрасно работать.
 
щас проверю, останется ли ресурс к файлу на диске рабочим, если его закрыть в дочке
в mysql должна быть привязка потока к соединению - это видно из process list (один поток на каждое соединение)
 
Сверху