URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1534
[ Назад ]

Исходное сообщение
"если прибить процесс с сокетом."

Отправлено vvk , 29-Мрт-03 09:26 
вот такой вопрос. если я из своей проги создаю процесс (fork()) и там работаю с сокетами, а потом эта самая прога решает, что то, что там посылается, уже никому не надо, и надо посылать другое. что если я прибью этот процесс с помощью kill? сокет закроется, или болтаться будет незакрытый? где то слышал, что бывает ограничение на количество открытых сокетов.

Содержание

Сообщения в этом обсуждении
"если прибить процесс с сокетом."
Отправлено Max Zinal , 29-Мрт-03 20:39 
>вот такой вопрос. если я из своей проги создаю процесс (fork()) и
>там работаю с сокетами, а потом эта самая прога решает, что
>то, что там посылается, уже никому не надо, и надо посылать
>другое. что если я прибью этот процесс с помощью kill? сокет
>закроется, или болтаться будет незакрытый? где то слышал, что бывает ограничение
>на количество открытых сокетов.

Сокеты - штука хитрая. После киляния процесса сокеты вроде как
освобождаются, за исключением одного скромного, но чертовски
важного момента: есть некое количество таймаутов, которые
должно выдерживать ядро, дабы обеспечить надёжную доставку
в соответствии с TCP-протоколом. Пример - состояние CLOSE_WAIT.
Так что реальное закрытие сокетов может произойти не сразу,
в течение 2-5 минут после убиения процесса либо выполнения
в оном процессе close() (без разницы, чего именно).


"если прибить процесс с сокетом."
Отправлено XMan , 30-Мрт-03 20:23 
Помимо ответа Max Zinal есть еще момент. Если ты открыл сокет, а потом сделал fork(), то сокет будет открыт и в потомке и в родителе. И пока ты не закроешь его и тут и там, он считается открытым.

"если прибить процесс с сокетом."
Отправлено igor , 31-Мрт-03 14:44 
>Помимо ответа Max Zinal есть еще момент. Если ты открыл сокет, а
>потом сделал fork(), то сокет будет открыт и в потомке и
>в родителе. И пока ты не закроешь его и тут и
>там, он считается открытым.
а может, наоборот, когда закроешь в одном потоке, во втором сокет будет недоступен?



"если прибить процесс с сокетом."
Отправлено XMan , 31-Мрт-03 15:13 
Не путай потоки ( pthread_create(...) ) и процессы ( fork() ) :)

Живой пример - любой TCP-ссервер, который принимает запрос на соединение, получает новый дескриптор сокета, порождает потомок-процесс, закрывает новый дскриптор и ждет следующего соединения. При этом потомок продолжает работать с клиентом.


"если прибить процесс с сокетом."
Отправлено vvk , 01-Апр-03 12:27 
сокет я открываю после fork(), поэтому такой вопрос не возникает.

>Помимо ответа Max Zinal есть еще момент. Если ты открыл сокет, а
>потом сделал fork(), то сокет будет открыт и в потомке и
>в родителе. И пока ты не закроешь его и тут и
>там, он считается открытым.