LINUX.ORG.RU

Закрытие сокетов при fork


0

0

Как культурно закрыть все дескрипторы вот в такой ситуации:

Сервер имеет в своем составе некоторый компонент который для работы порождает через fork несколько процессов. Тела этих процессов написаны 3-ей фирмой и исправить их нельзя. Компонент сервера выполняющий fork про сам сервер ничего не знает. Все замечательно работает до того момента как сервер падает и поднимается опять. После этого слушаемые сокеты оказываются захвачены порожденными процессами.

Вариант с завершением child процессов невозможен по ряду причин, которые долго описывать.


Ответ на: комментарий от Murr

Или что мешает перед вызовами компонента, которые могут породить процессы самому делать fork и закрывать все сокеты?

Murr ★★
()
Ответ на: комментарий от Murr

Вот вопрос в том, как получить список всех fd процесса чтобы их закрыть после fork. Сервер представляет из себя java машину, а запускает процессы native код.

aliher
() автор топика
Ответ на: комментарий от Murr

fcntl на сокет, который необходимо закрывать?

aliher
() автор топика
Ответ на: комментарий от aliher

Список всех fd можно получить просто пробежавшись по /proc/pid/fd (/proc/self/fd). Может быть можно просто все закрыть for(i=0;i<getdtablesize();i++) close(i); - зависит от семантики.

Я правильно понимаю задачу: Java метод вызывает некий native код->тот наследует все fd->делает fork->все дочерние процессы получают некий дескриптор?

Можно из Java вызывать некий промежуточный код, который сделает этот самый close, а потом - код сервера.

Murr ★★
()
Ответ на: комментарий от Murr

Единственная проблема, нужно чтоб это хозяйство работало под соляркой еще. Не знаю как там с /proc получится. А закрыть в цикле все fd как-то очень кондово получается.

На счет прослойки я согласен, другого пути похоже нет. Вопрос только с закрытием остается.

aliher
() автор топика

Для закрытия всех возможных дескрипторов:
for (i = sysconf(_SC_OPEN_MAX) - 1; i >= 0; i--) close(i);

nobody ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.