URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2747
[ Назад ]

Исходное сообщение
"Как закрыть все дескрипторы? Делаю fork, после чего"

Отправлено Lamr , 01-Апр-04 16:19 
родитель закрывает присоединённый сокет и должен слушать
дальше. Из потомка запускаю execl демона, но процесс видимо
получил копию сокета, которую я закрыл в предке, и по прежнему
select. Передавать в функцию fork-execl все возможно открытые
дескрипторы очень громозко. Нет ли функции, закрывающей все полученные
по наследству дескрипторы без передачи их параметром?

Содержание

Сообщения в этом обсуждении
"Как закрыть все дескрипторы? Делаю fork, после чего"
Отправлено kavel , 01-Апр-04 18:34 
>родитель закрывает присоединённый сокет и должен слушать
>дальше. Из потомка запускаю execl демона, но процесс видимо
>получил копию сокета, которую я закрыл в предке, и по прежнему
>select. Передавать в функцию fork-execl все возможно открытые
>дескрипторы очень громозко. Нет ли функции, закрывающей все полученные
>по наследству дескрипторы без передачи их параметром?

попробуй fcntl(sockfd, F_SETFD, ...), сам не пробовал, но должно помочь, вопрос только чем FD_CLOEXEC бит ставить.



"Как закрыть все дескрипторы? Делаю fork, после чего"
Отправлено kavel , 01-Апр-04 18:59 
>>родитель закрывает присоединённый сокет и должен слушать
>>дальше. Из потомка запускаю execl демона, но процесс видимо
>>получил копию сокета, которую я закрыл в предке, и по прежнему
>>select. Передавать в функцию fork-execl все возможно открытые
>>дескрипторы очень громозко. Нет ли функции, закрывающей все полученные
>>по наследству дескрипторы без передачи их параметром?
>
>попробуй fcntl(sockfd, F_SETFD, ...), сам не пробовал, но должно помочь, вопрос только
>чем FD_CLOEXEC бит ставить.

нашел как


    int
    set_cloexec_flag (int desc, int value)
    {
      int oldflags = fcntl (desc, F_GETFD, 0);
      /* If reading the flags failed, return error indication now.
      if (oldflags < 0)
        return oldflags;
      /* Set just the flag we want to set. */
      if (value != 0)
        oldflags |= FD_CLOEXEC;
      else
        oldflags &= ~FD_CLOEXEC;
      /* Store modified flag word in the descriptor. */
      return fcntl (desc, F_SETFD, oldflags);
    }


"Как закрыть все дескрипторы? Делаю fork, после чего"
Отправлено pth , 02-Апр-04 03:20 
>дескрипторы очень громозко. Нет ли функции, закрывающей все полученные
>по наследству дескрипторы без передачи их параметром?

void
est_takaja_funktsija(void)
{
    int fd = getdtablesize();

    while(--fd >= 0)
        close(fd);

}

:)


"Всем, кто поучаствовал в треде"
Отправлено Lamr , 02-Апр-04 10:13 
СПАСИБА!!!!