Скажем, у нас есть открытый SocketChannel
. Важно ли явно закрывать его перед завершением работы приложения? Другими словами, если мы этого не сделаем, есть ли риск оставить незакрытыми системные ресурсы?
Нужно ли явно закрывать SocketChannel при завершении работы приложения?
Ответы (2)
Предполагая, что ваша ОС является современной многопользовательской операционной системой, нет риска, что выход из процесса без закрытия каналов, докетов, файловых дескрипторов оставит ресурсы незакрытыми. Все ресурсы, принадлежащие процессу пользовательского пространства, обрабатываются ОС надлежащим образом (т. е. при необходимости закрываются1) при завершении процесса.
Это применимо, когда пользовательский процесс представляет собой JVM, выполняющую приложение Java, а также к любому другому пользовательскому процессу.
1 - Это немного сложнее, чем "все закрыто". Например, в UNIX/Linux дочерний процесс может наследовать дескрипторы открытых «файлов» от своего родителя, поэтому вполне возможно, что два или более пользовательских процесса могут совместно использовать сетевой сокет. ОС обработает этот сценарий с помощью подсчета ссылок.
Сокет автоматически закроется, когда ваш процесс завершится, и все ресурсы процесса будут освобождены.
НО, если это сокет TCP, то другой конец обычно не будет уведомлен, когда это произойдет. Это будет так же, как если бы кто-то отключил сетевой кабель.
Если вы взаимодействуете между процессами на одном компьютере, вы можете вместо этого использовать каналы, которые обеспечивают надежное уведомление на другом конце, когда ваш конец автоматически закрывается.
Если вы хотите создать процесс и заставить его умереть, когда родитель выйдет из строя, я предлагаю использовать для этого безымянный канал к дочернему процессу stdin. Это самое простое и очень надежное.
shutdown()
), если вы не установили Linger, тогда он отправляет RST; Windows отправляет RST. Для смарткарты или чего-то подобного, может и нет.
- person dave_thompson_085; 13.09.2018
close
, он также закрываетSocket
, и я думаю, что это то, что вам может понадобиться - person Eugene   schedule 12.09.2018