11

Я прочитал этот вопрос о Linux. Может ли порт быть привязан после завершения процесса?
Похоже, что Linux очищается после выхода из процессов и оставления открытых сокетов. Мне было интересно, есть ли какие-либо спецификации о том, как это работает в Windows. Постоянно ли ОС заботится о закрытии сокетов для процессов, которые выходят без их закрытия?

3 ответа3

9

В Windows и Unixen при выходе из процесса ядро закрывает все открытые дескрипторы.

Windows NT

Завершение процесса - MSDN

Завершение процесса имеет следующие результаты:

  • [...]
  • Любые ресурсы, выделенные процессом, освобождаются.
  • Все объекты ядра закрыты.
  • [...]

Хотя открытые дескрипторы объектов ядра автоматически закрываются при завершении процесса, сами объекты существуют до тех пор, пока все открытые дескрипторы к ним не будут закрыты. Следовательно, объект останется действительным после того, как процесс, использующий его, завершит свою работу, если другой процесс имеет открытый дескриптор.

Функция ExitProcess - MSDN

Выход из процесса вызывает следующее:

  • [...]
  • Все дескрипторы объекта, открытые процессом, закрыты.
  • [...]

Linux

exit(3) - Руководство программиста Linux (функции libc)

Все открытые потоки stdio (3) сбрасываются и закрываются.

_exit(2) - Руководство программиста Linux (системные вызовы ядра)

Функция _exit() завершает вызывающий процесс "немедленно". Все дескрипторы открытого файла, принадлежащие процессу, закрыты; любые дочерние элементы процесса наследуются процессом 1, init, и родительскому процессу отправляется сигнал SIGCHLD.


Обратите внимание, что в обеих операционных системах

  1. Сокеты - это только один тип файловых дескрипторов (fd's) / объектов ядра, поэтому вышеизложенное относится в равной степени к файлам и сокетам.

  2. Описания файлов на Unix, а также объект обрабатывает объекты ядра на Windows, могут принадлежать нескольким процессам - они их ручки могут быть унаследованы дочерними процессами и даже ходили с использованием специальных IPC функций.

  3. Файл или сокет закрываются только тогда, когда все fd, указывающие на него, уничтожены.

5

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

Если процесс перестает существовать, его сокеты обязательно прекращают существовать. Не существует концепции сокета без процесса его удержания. Вот почему даже драйверы ядра Windows, которые хотят создавать сокеты на уровне ядра, должны указывать процесс для владения сокетом или вызывать функцию из контекста процесса, который может владеть сокетом. (Или они могут манипулировать конечными точками напрямую, без использования сокетов.)

Похоже, ваш вопрос действительно касается не сокетов, а самих конечных точек связи. Сокет имеет ссылку на свою конечную точку связи. Когда сокет исчезает, счетчик ссылок падает. Если он достигнет нуля, он будет удален, как только это допустимо, учитывая требования протокола связи, с которым связана конечная точка. TCP имеет состояние TIME_WAIT, в течение которого конечная точка должна поддерживаться для обработки любых "оставшихся" пакетов.

3

Да, это так. Это был способ Windows 3.1 95 98 XP (по крайней мере, я знаю наверняка с XP).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .