O Windows cuida do fechamento de soquetes quando os processos saem?

11

Eu li esta pergunta sobre o Linux, Uma porta pode ser ligada quando o processo é encerrado?
O Linux parece limpar após os processos que saem e deixando os sockets abertos. Eu queria saber se há alguma especificação sobre como isso funciona no Windows. O sistema operacional cuida consistentemente do fechamento de soquetes para processos que saem sem fechá-los?

    
por Simone 06.01.2012 / 23:31

3 respostas

9

No Windows e no Unixen, quando um processo sai, o kernel fecha todas as alças abertas.

Windows NT

Terminating a Process – MSDN

Terminating a process has the following results:

  • [...]
  • Any resources allocated by the process are freed.
  • All kernel objects are closed.
  • [...]

While open handles to kernel objects are closed automatically when a process terminates, the objects themselves exist until all open handles to them are closed. Therefore, an object will remain valid after a process that is using it terminates if another process has an open handle to it.

ExitProcess function – MSDN

Exiting a process causes the following:

  • [...]
  • All of the object handles opened by the process are closed.
  • [...]

Linux

exit(3) – Linux Programmer's Manual (libc functions)

All open stdio(3) streams are flushed and closed.

_exit(2) – Linux Programmer's Manual (kernel syscalls)

The function _exit() terminates the calling process "immediately". Any open file descriptors belonging to the process are closed; any children of the process are inherited by process 1, init, and the process's parent is sent a SIGCHLD signal.

Observe que, nos dois sistemas operacionais,

  1. Sockets são apenas um tipo de descritores de arquivos (fd's) / objetos do kernel, portanto, o acima se aplica igualmente a arquivos e sockets.

  2. As descrições dos arquivos no Unix, bem como os objetos do kernel de objetos gerenciados no Windows, podem ser de propriedade de vários processos - eles suas alças podem ser herdadas por processos filhos e até transmitidas usando funções IPC especiais.

  3. Um arquivo ou socket só é fechado quando todos os fd's apontados para ele são destruídos.

por 06.01.2012 / 23:53
5

No Windows, um soquete é um link entre um terminal de comunicação e um processo. É por isso que, quando você duplica um soquete, acaba com dois soquetes, mas apenas um terminal. É por isso que você não pode passar um soquete de um processo para outro sem criar um novo soquete no outro processo.

Se o processo deixar de existir, seus soquetes necessariamente deixarão de existir. Não há conceito de um soquete sem um processo para mantê-lo. É por isso que os drivers do kernel do Windows que desejam criar soquetes no nível do kernel deve especificar um processo para possuir o soquete ou chamar a função de um contexto de processo que pode possuir o soquete. (Ou eles podem manipular os pontos de extremidade diretamente sem usar soquetes.)

Sua pergunta parece não ser realmente sobre soquetes, mas sobre os terminais de comunicação em si. Um soquete tem uma referência ao seu terminal de comunicação. Quando o soquete vai embora, a contagem de referência cai. Se ele chegar a zero, ele será removido assim que isso for permitido, de acordo com os requisitos do protocolo de comunicação ao qual o nó de extremidade está associado. O TCP tem um estado TIME_WAIT durante o qual o nó de extremidade deve ser mantido para manipular quaisquer pacotes "restantes".

    
por 07.01.2012 / 03:16
3

Sim, sim. Tem sido assim o sentido das janelas 3.1 95 98 XP (Pelo menos eu tenho certeza desde o XP).

    
por 06.01.2012 / 23:48