Как обрабатывается сокетное соединение в разветвленном процессе - PullRequest
32 голосов
/ 16 мая 2011

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

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

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

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

Ответы [ 2 ]

24 голосов
/ 16 мая 2011
  1. Сначала accept() входящее соединение.Процесс принятия теперь имеет дескриптор для прослушивающего сокета и недавно принятый сокет.
  2. Вилка и:
    • В дочернем:
      1. Закройте прослушивающий сокет.
      2. Выполните заполнение с принятым сокетом.
    • В родительском:
      1. Закройте принятый сокет.
      2. Возобновите цикл приема.

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

18 голосов
/ 20 мая 2011

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

...