Приветствую. Подскажите плиз почему дочерний процесс в linux держит TCP порт, который открыт и используется ? как этого избежать? получается ситуация, чтио порт остается в использовании и не получается забиндиться заново пока дочерний процесс не убить ну допустим процесс аварийно завершится..не закрыли его..
Комментарии: 15
Maxim
Есть еще SO_REUSEADDR + SO_REUSEPORT Тогда само отвалится через некоторое время
Dinar
не отваливается - lsof говорит порт используется процессом другим..который был запущен из текущего который убился
Maxim
Потому что он этот сокет унаследовал
Dinar
хотя в логике того дочернего этот порт и в помине не используется и как правильно освободить порт?
Maxim
Закрывать после форка
Dinar
реюз не сработал почему то я пробовал.. как?
Maxim
Если там форк+экзек, то O_CLOEXEC close()
Dinar
дочерний процесс закрывать?
Maxim
После форка закрыть сокет, и все После чего дочерний процесс не будет его держать Точнее, дескриптор сокета, сам сокет по идее закрыться не должен, т.к. есть еще дескрипторы
Anonim
Ух эта кривая хуйня, по дефолту все дескрипторы наследуются
Dinar
а потом заново открыть? сокет то нужен)
Maxim
Вот да, я уточнил, что close закрывает именно дескриптор
Anonim
А без клоекзек хз как их закрывать, я видел костыли типа в цикле закрытие тупо всех дескрипторов по номерам
Maxim
У тебя там только fork, или fork+exec?
Dinar
там не fork, там системный вызов service name start