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

Комментарии: 15

  1. 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

Не нашли ответ?

Вам также может быть интересно