O Windows cuida do fechamento de soquetes quando os processos são encerrados?
12
Eu li esta pergunta sobre o Linux. Uma porta pode ser ligada quando o processo terminar?
O Linux parece limpar após a saída dos processos e os soquetes abertos. Eu queria saber se há alguma especificação sobre como isso funciona no Windows. O sistema operacional cuida de maneira consistente de fechar soquetes para processos que saem sem fechá-los?
A finalização de um processo tem os seguintes resultados:
[...]
Quaisquer recursos alocados pelo processo são liberados.
Todos os objetos do kernel estão fechados.
[...]
Enquanto os identificadores abertos para objetos do kernel são fechados automaticamente quando um processo termina, os próprios objetos existem até que todos os identificadores abertos sejam fechados. Portanto, um objeto permanecerá válido após o término de um processo em uso, se outro processo tiver um identificador aberto.
Todos os identificadores de objeto abertos pelo processo são fechados.
[...]
Linux
exit(3) - Manual do Programador Linux (funções libc)
Todos os fluxos de stdio aberto (3) são liberados e fechados.
_exit(2) - Manual do Programador Linux (syscalls do kernel)
A função _exit()finaliza o processo de chamada "imediatamente". Todos os descritores de arquivos abertos pertencentes ao processo são fechados; quaisquer filhos do processo são herdados pelo processo 1, init e o pai do processo recebe um sinal SIGCHLD.
Observe que nos dois sistemas operacionais,
Os soquetes são apenas um tipo de descritor de arquivos (fd) / objetos do kernel; portanto, o acima se aplica igualmente a arquivos e soquetes.
As descrições de arquivo no Unix, bem como os manipuladores de objetos no Windows, podem pertencer a vários processos - eles podem ser herdados por processos filhos e até mesmo distribuídos usando funções especiais do IPC.
Um arquivo ou soquete é fechado somente quando todos os fds apontando para ele são destruídos.
Soquetes TCP são um caso especial, devido a seus estados TIME_WAIT. Por exemplo, se você encerra um aplicativo que está ouvindo em uma porta TCP, geralmente não é possível vincular à mesma porta imediatamente.
haimg
2
Não. Os descritores de arquivo e os identificadores de objetos pertencem e são acessíveis a apenas um processo e são estritamente entidades por processo . É a descrição do arquivo e o objeto subjacente que são compartilhados entre os processos.
JdeBP
5
No Windows, um soquete é um link entre um ponto de extremidade de comunicação e um processo. É por isso que, quando você duplica um soquete, acaba com dois soquetes, mas apenas um ponto final. É 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 deixa de existir, seus soquetes necessariamente deixam de existir. Não existe um conceito de soquete sem um processo para mantê-lo. É por isso que mesmo os drivers do kernel do Windows que desejam criar soquetes no nível do kernel devem especificar um processo para possuir o soquete ou chamar a função a partir de um contexto de processo que possa possuir o soquete. (Ou eles podem manipular os terminais diretamente sem usar soquetes.)
Sua pergunta parece realmente não ser sobre soquetes, mas sobre os pontos finais de comunicação. Um soquete tem uma referência ao seu terminal de comunicação. Quando o soquete desaparece, a contagem de referência cai. Se atingir zero, será removido assim que for permitido, considerando os requisitos do protocolo de comunicação ao qual o terminal está associado. O TCP possui um estado TIME_WAIT durante o qual o ponto de extremidade deve ser mantido para manipular quaisquer pacotes "restantes".
Não, não tem. Desde o Windows NT versão 3. 5 , talvez. Mas o DOS-Windows era um animal muito diferente do Windows NT quando se tratava de soquetes; e o DOS-Windows 95 diferia significativamente do DOS-Windows 3.1, além disso. Os aplicativos Win16 eram obrigados a chamar WSACleanup()caso contrário, vazamentos aconteciam; e houve um problema grave no DOS-Windows 9x, documentado no artigo MSKB # 156319, com processos-pai invalidando soquetes passados para seus filhos, causados pela semântica de saída de processos bastante diferente do DOS-Windows para soquetes.
JdeBP
1
@JdeBP: E o Windows NT 3. 1 - ele executou a limpeza automática?
No Windows, um soquete é um link entre um ponto de extremidade de comunicação e um processo. É por isso que, quando você duplica um soquete, acaba com dois soquetes, mas apenas um ponto final. É 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 deixa de existir, seus soquetes necessariamente deixam de existir. Não existe um conceito de soquete sem um processo para mantê-lo. É por isso que mesmo os drivers do kernel do Windows que desejam criar soquetes no nível do kernel devem especificar um processo para possuir o soquete ou chamar a função a partir de um contexto de processo que possa possuir o soquete. (Ou eles podem manipular os terminais diretamente sem usar soquetes.)
Sua pergunta parece realmente não ser sobre soquetes, mas sobre os pontos finais de comunicação. Um soquete tem uma referência ao seu terminal de comunicação. Quando o soquete desaparece, a contagem de referência cai. Se atingir zero, será removido assim que for permitido, considerando os requisitos do protocolo de comunicação ao qual o terminal está associado. O TCP possui um estado TIME_WAIT durante o qual o ponto de extremidade deve ser mantido para manipular quaisquer pacotes "restantes".
fonte
Sim. Tem sido assim que o windows
3.19598XP (pelo menos eu sei com certeza desde XP).fonte
WSACleanup()
caso contrário, vazamentos aconteciam; e houve um problema grave no DOS-Windows 9x, documentado no artigo MSKB # 156319, com processos-pai invalidando soquetes passados para seus filhos, causados pela semântica de saída de processos bastante diferente do DOS-Windows para soquetes.