Файловые дескрипторы действительно «наследуются» при разветвлении, но только в отношении того, к какому сокету они подключены, и закрытие файлового дескриптора закроет сокет, только если он последний, связанный с этим сокетом (или файлом, еслимы имеем дело с файлами).
То, что вы обычно делаете, это устанавливаете сокет и затем выполняете форк.В родительском процессе (тот, где fork вернул ненулевое значение), вы можете пойти дальше и закрыть файловый дескриптор, используя close(fd)
, если вы этого не сделаете, у вас в конечном итоге закончатся файловые дескрипторы в родительском процессе.Это для потоковых (например, TCP) сокетов, где у вас есть один сокет сервера, прослушивающий соединения, и один сокет на установленное соединение.Однако вы используете UDP, так что на самом деле есть только один сокет, и если вы намерены продолжать использовать его в родительском процессе, вам необходимо выяснить, как разделить его между родительским и дочерним процессами.Оба могут продолжать использовать его, но это будет почти случайно, кто что читает и в каком порядке отправляется материал.В этом случае у вас обычно есть какой-то процесс мультиплексирования, который получает пакеты и перенаправляет их соответствующему дочернему элементу (по некоторому другому механизму, например каналам или другим сокетам) на основе некоторого содержимого сообщения (в TCP это исходный IP-адрес)./ port и целевой ip / port tuple).
Как указал Мэтт, использование shutdown
фактически сделает сокет непригодным для использования (обычно это не доступно для записи, но вы можете указать это) для всех участников.В TCP это может инициировать отправку пакета FIN, эффективно инициируя разрыв соединения, но вы все равно сможете получать данные, пока удаленный конец не подтвердит FIN.