Windows si occupa della chiusura dei socket all'uscita dai processi?


Risposte:


10

Su Windows e Unixen, quando un processo termina il kernel chiude tutti gli handle aperti.

Windows NT

Terminare un processo - MSDN

La conclusione di un processo ha i seguenti risultati:

  • [...]
  • Tutte le risorse allocate dal processo vengono liberate.
  • Tutti gli oggetti del kernel sono chiusi.
  • [...]

Mentre gli handle aperti agli oggetti del kernel vengono chiusi automaticamente al termine di un processo, gli oggetti stessi esistono fino a quando tutti gli handle aperti non vengono chiusi. Pertanto, un oggetto rimarrà valido dopo la fine di un processo che lo utilizza se un altro processo ha un handle aperto su di esso.

ExitProcessfunzione - MSDN

L'uscita da un processo provoca quanto segue:

  • [...]
  • Tutti gli handle di oggetti aperti dal processo sono chiusi.
  • [...]

Linux

exit(3) - Manuale del programmatore Linux (funzioni libc)

Tutti i flussi stdio (3) aperti vengono scaricati e chiusi.

_exit(2) - Manuale del programmatore Linux (kernel syscalls)

La funzione _exit()termina il processo di chiamata "immediatamente". Tutti i descrittori di file aperti appartenenti al processo vengono chiusi; tutti i figli del processo sono ereditati dal processo 1, init e al genitore del processo viene inviato un segnale SIGCHLD.


Si noti che su entrambi i sistemi operativi,

  1. I socket sono solo un tipo di descrittori di file (fd's) / oggetti kernel, quindi quanto sopra si applica ugualmente a file e socket.

  2. Descrizioni dei file su Unix, così come le maniglie degli oggetti del kernel di oggetti su Windows, possono essere di proprietà di molteplici processi - essi i manici possono essere ereditate dai processi figli e anche passati in giro con funzioni speciali IPC.

  3. Un file o un socket viene chiuso solo quando tutti gli FD che puntano ad esso vengono distrutti.


2
I socket TCP sono un caso speciale, a causa dei loro stati TIME_WAIT. Ad esempio, se si termina un'applicazione in ascolto su una porta TCP, spesso non è possibile eseguire immediatamente il binding alla stessa porta.
Haimg

2
No. I descrittori di file e gli handle degli oggetti sono di proprietà e accessibili a un solo processo e sono entità strettamente per processo . È la descrizione del file e l'oggetto sottostante che sono condivisi tra i processi.
JdeBP,

5

Su Windows, un socket è un collegamento tra un endpoint di comunicazione e un processo. Questo è il motivo per cui, quando si duplica una presa, si finisce con due prese ma solo un endpoint. Questo è il motivo per cui non è possibile passare un socket da un processo a un altro senza creare un nuovo socket nell'altro processo.

Se il processo cessa di esistere, i suoi socket cessano necessariamente di esistere. Non esiste un concetto di socket senza un processo per trattenerlo. Questo è il motivo per cui anche i driver del kernel di Windows che desiderano creare socket a livello di kernel devono specificare un processo per possedere il socket o chiamare la funzione da un contesto di processo che può possedere il socket. (Oppure possono manipolare gli endpoint direttamente senza usare i socket.)

La tua domanda sembra non riguardare davvero i socket ma gli stessi endpoint di comunicazione. Un socket ha un riferimento al suo endpoint di comunicazione. Quando il socket scompare, il conteggio dei riferimenti diminuisce. Se raggiunge lo zero, verrà rimosso non appena ciò è consentito dati i requisiti del protocollo di comunicazione a cui è associato l'endpoint. TCP ha uno stato TIME_WAIT durante il quale l'endpoint deve essere mantenuto in giro per gestire eventuali pacchetti "rimanenti".


3

Sì lo fa. È stato in questo modo senso Windows 3.1 95 98 XP (almeno lo so per certo da XP).


1
No, no. Dalla versione 3. 5 di Windows NT , forse. Ma DOS-Windows era un animale molto diverso da Windows NT quando si trattava di socket; e DOS-Windows 95 differivano significativamente da DOS-Windows 3.1, inoltre. Le applicazioni Win16 sono state richieste per chiamare altrimenti si sono verificate perdite; e c'era un brutto problema in DOS-Windows 9x, documentato nell'articolo # 156319 di MSKB, con i processi parent che invalidavano i socket passati ai loro figli, causati dalla semantica di uscita del processo DOS-Windows piuttosto diversa per i socket. WSACleanup()
JdeBP

1
@JdeBP: Che dire di Windows NT 3. 1 - ha eseguito la pulizia automatica?
user1686

1
3.1 non aveva socket in primo luogo.
JdeBP,

... buon punto, @JdeBP - Non ci ho pensato.
user1686

@JdeBP Risposta aggiornata per correggerla.
Scott Chamberlain,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.