вот такой вопрос. если я из своей проги создаю процесс (fork()) и там работаю с сокетами, а потом эта самая прога решает, что то, что там посылается, уже никому не надо, и надо посылать другое. что если я прибью этот процесс с помощью kill? сокет закроется, или болтаться будет незакрытый? где то слышал, что бывает ограничение на количество открытых сокетов.
>вот такой вопрос. если я из своей проги создаю процесс (fork()) и
>там работаю с сокетами, а потом эта самая прога решает, что
>то, что там посылается, уже никому не надо, и надо посылать
>другое. что если я прибью этот процесс с помощью kill? сокет
>закроется, или болтаться будет незакрытый? где то слышал, что бывает ограничение
>на количество открытых сокетов.Сокеты - штука хитрая. После киляния процесса сокеты вроде как
освобождаются, за исключением одного скромного, но чертовски
важного момента: есть некое количество таймаутов, которые
должно выдерживать ядро, дабы обеспечить надёжную доставку
в соответствии с TCP-протоколом. Пример - состояние CLOSE_WAIT.
Так что реальное закрытие сокетов может произойти не сразу,
в течение 2-5 минут после убиения процесса либо выполнения
в оном процессе close() (без разницы, чего именно).
Помимо ответа Max Zinal есть еще момент. Если ты открыл сокет, а потом сделал fork(), то сокет будет открыт и в потомке и в родителе. И пока ты не закроешь его и тут и там, он считается открытым.
>Помимо ответа Max Zinal есть еще момент. Если ты открыл сокет, а
>потом сделал fork(), то сокет будет открыт и в потомке и
>в родителе. И пока ты не закроешь его и тут и
>там, он считается открытым.
а может, наоборот, когда закроешь в одном потоке, во втором сокет будет недоступен?
Не путай потоки ( pthread_create(...) ) и процессы ( fork() ) :)Живой пример - любой TCP-ссервер, который принимает запрос на соединение, получает новый дескриптор сокета, порождает потомок-процесс, закрывает новый дскриптор и ждет следующего соединения. При этом потомок продолжает работать с клиентом.
сокет я открываю после fork(), поэтому такой вопрос не возникает.>Помимо ответа Max Zinal есть еще момент. Если ты открыл сокет, а
>потом сделал fork(), то сокет будет открыт и в потомке и
>в родителе. И пока ты не закроешь его и тут и
>там, он считается открытым.