Подтвердить что ты не робот

Как обрабатывается соединение сокета в раздвоенном процессе

У меня есть программа, которая служит TCP-сервером, который слушает порт 5000, например.

Теперь я хочу запустить другой процесс командной строки для параллельной работы с этим сервером. Я знаю, что правильный способ сделать это - разветкить сервер, чем вызвать "exec"....

Мой вопрос в том, что дочерний процесс также "владеет" этим портом 5000? Если я хочу выпустить этот порт 5000, мне нужно убить как родительский процесс, так и дочерний процесс?

Мне просто очень любопытно, как это сокетное соединение обрабатывается в forking.

4b9b3361

Ответ 1

  • Во-первых, accept() входящее соединение. Процесс принятия теперь имеет ручку для слушающего сокета и вновь принятый сокет.
  • Вилка и:
    • У ребенка:
      • Закройте прослушивающий разъем.
      • Сделайте что-нибудь с принятым сокетом.
    • В родительском:
      • Закройте принятый сокет.
      • Возобновить цикл принятия.

Различные ресурсы сокетов будут восстановлены, когда все ссылки на дескриптор будут закрыты. Если процесс завершается, все его дескрипторы закрываются неявно. Поэтому, если дочерний элемент закрывает дескриптор, он наследует сокет для прослушивания, единственный родитель, который остается в этом сокете, существует в родительском. Затем прослушивающий сокет будет восстановлен, когда родительский терминал завершится или закрывает этот дескриптор явно.

Ответ 2

Да, он делает Всякий раз, когда создается дочерний процесс, он получает копию таблицы дескриптора файла из родительского процесса. И есть счетчик ссылок, соответствующий каждому файловому дескриптору, то есть количеству процессов, которые в настоящее время обращаются к файлу/сокету. Таким образом, если сокет открыт в основном процессе и создается дочерний процесс, счетчик ссылок увеличивается, так как он теперь открыт и в дочернем процессе, а когда он закрыт в любом из процессов, он уменьшается. Сокет окончательно закрывается, когда счетчик ссылок достигает нуля.