Нужно ли закрывать SocketChannel при завершении работы приложения? - PullRequest
0 голосов
/ 12 сентября 2018

Скажем, у нас открыт SocketChannel. Важно ли явно закрыть его перед прекращением работы приложения? Другими словами, если мы этого не сделаем, есть ли риск оставить незакрытые системные ресурсы?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Сокет автоматически закроется, когда ваш процесс завершится, и все ресурсы процесса будут освобождены.

НО, если это сокет TCP, другой конец, как правило, не будет уведомлен, когда это произойдет.Это будет так же, как если бы кто-то отключил сетевой кабель.

Если вы связываетесь между процессами на одном компьютере, вы можете вместо этого использовать каналы, которые обеспечивают надежное уведомление на другом конце, когда ваш конецавтоматически закрывается.

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

0 голосов
/ 12 сентября 2018

Предполагая, что ваша ОС является современной многопользовательской операционной системой, нет риска, что выход из процесса без закрытия каналов, досьетов, файловых дескрипторов оставит ресурсы незакрытыми.Все ресурсы, принадлежащие процессу пользовательского пространства, обрабатываются операционной системой соответствующим образом (то есть закрываются при необходимости 1 ) при выходе из процесса.

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


1 - Это немного сложнее, чем "все закрыто".Например, в UNIX / Linux дочерний процесс может наследовать открытые «файловые» дескрипторы от своего родителя, поэтому вполне возможно, что два или более пользовательских процесса могут совместно использовать сетевой сокет.ОС будет обрабатывать этот сценарий с подсчетом ссылок.

...