Чи піклується Windows про закриття розеток при виході з процесів?


12

Я читав це питання про Linux, чи може порт бути зв'язаний, коли процес закінчиться?
Здається, що Linux очищається після закінчення процесів і залишає відкриті розетки. Мені було цікаво, чи є специфікація про те, як це працює в Windows. Чи послідовно ОС турбується про закриття сокетів для процесів, які виходять, не закриваючи їх?

Відповіді:


10

І в Windows, і в Unixen, коли процес закінчується, ядро ​​закриває всі відкриті ручки.

Windows NT

Припинення процесу - MSDN

Припинення процесу має такі результати:

  • [...]
  • Будь-які ресурси, виділені процесом, звільняються.
  • Усі об'єкти ядра закриті.
  • [...]

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

ExitProcessфункція - MSDN

Вихід із процесу викликає наступне:

  • [...]
  • Усі ручки об'єкта, відкриті процесом, закриті.
  • [...]

Linux

exit(3) - Посібник для програміста Linux (функції libc)

Усі відкриті потоки stdio (3) промиті та закриті.

_exit(2) - Посібник для програміста Linux (sscalls ядра)

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


Зауважте, що в обох операційних системах

  1. Сокети - це лише один тип дескрипторів файлів (fd's) / об’єктів ядра, тому вищезазначене стосується файлів і сокетів.

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

  3. Файл або сокет закривається лише тоді, коли знищені всі вказівки FD на нього.


2
TCP-розетки є особливим випадком, оскільки їх стан TIME_WAIT. Наприклад, якщо ви припиняєте програму прослуховування через порт TCP, часто не можна відразу прив’язатись до того самого порту.
haimg

2
No. Файлові дескриптори і об'єктні ручки належать і доступні тільки один процесу, і строго в процесі суті. Це опис файлу та базовий об'єкт, який поділяється між процесами.
JdeBP

5

У Windows сокет - це зв'язок між кінцевою точкою зв'язку та процесом. Ось чому, коли ви дублюєте розетку, ви закінчуєтесь двома розетками, але лише однією кінцевою точкою. Ось чому ви не можете передавати сокет з одного процесу в інший, не створюючи нового сокета в іншому процесі.

Якщо процес припиняє своє існування, його розетки обов'язково припиняють своє існування. Не існує концепції розетки без процесу її утримання. Ось чому навіть драйвери ядра Windows, які бажають створити сокети на рівні ядра, повинні вказати процес для володіння сокетом або виклик функції з контексту процесу, який може володіти сокетом. (Або вони можуть маніпулювати кінцевими точками безпосередньо, не використовуючи розетки.)

Здається, ваше питання стосується не розеток, а самих кінцевих точок зв'язку. Розетка має посилання на свою кінцеву точку зв'язку. Коли розетка згасає, контрольна кількість падає. Якщо він досягне нуля, він буде видалений, як тільки це допустимо, враховуючи вимоги протоколу зв'язку, з яким пов'язана кінцева точка. TCP має стан TIME_WAIT, протягом якого кінцеву точку потрібно тримати навколо, щоб обробляти будь-які пакети, що залишилися.


3

Так. Це був сенс Windows 3.1 95 98 XP (принаймні, я точно знаю з XP).


1
Ні, ні. Оскільки Windows NT версії 3. 5 , можливо. Але DOS-Windows була зовсім іншою твариною для Windows NT, коли мова зайшла про сокети; Крім того, DOS-Windows 95 значно відрізнявся від DOS-Windows 3.1. Програми Win16 були потрібні для виклику, WSACleanup()інакше відбулися витоки; і в DOS-Windows 9x виникла жахлива проблема, задокументована в статті MSKB № 156319, коли батьківські процеси недійсні сокети передавали їх дітям, викликані досить різною семантикою виходу процесу для розеток DOS-Windows.
JdeBP

1
@JdeBP: Що з Windows NT 3. 1 - чи виконувала вона автоматичне очищення?
користувач1686

1
3.1 не було розеток в першу чергу.
JdeBP

... Добрий момент, @JdeBP - я про це не думав.
користувач1686

@JdeBP Оновлена ​​відповідь, щоб її виправити.
Скотт Чемберлен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.