LINUX.ORG.RU

Как закрыть все файловые дескрипторы?


0

0

Есть приложение, оно форкается и в потомке выполняется exec(), нужно что бы запушенное с помощью exec приложение не наследовало открытые файловые дескрипторы.

Тут как я вижу 2 варианта: 1)В родительской проге после вызова fork() закрыть все открытые дескрипторы, а потом вызывать exec(), но я не знаю какие дескрипторы на данный момент открыты(а узнать не могу, так как это выполняется в плагине) Т.е. надо закрыть все открытые на данный момент дескрипторы.

2)В приложении, запущенном с помощью exec(), закрыть унаследованные файловые дескрипторы, но я опять же не знаю как это сделать.

Вопрос: как закрыть все открытые файловей дескрипторы, при том что я не знаю их?

Это должно работать как на linux, так и на FreeBSD.


#include <unistd.h>
void closeall() {
    long max = sysconf(_SC_OPEN_MAX);

    while (--max >= 0)
        close(max);
}


Это исходит из того, что дескрипторы выделяются в порядке возрастания (в Linux это так).

anonymous
()
Ответ на: комментарий от platerx

Будет EBADF.

Мне довольно часто приходилось видеть применение техники с закрытием всего подряд в реальных программах, так что проблемы тут нет.

anonymous
()

В папаше выставить fcntl(2): F_SETFD Set the close-on-exec flag to the value specified by the FD_CLOEXEC bit of arg.

Я не пробовал :].

sf ★★★
()
Ответ на: комментарий от platerx

Да в общем-то тот же while :].

Просто я не дочитал до конца. А зачем такое может быть нужно (прям так все и закрыть)?

sf ★★★
()
Ответ на: комментарий от sf

Есть некая большая программа, нужен плагин для осушествления перезапуска проги, т.е. этот плагин должен запустить скрипт который остановит программу, а затем запустит её. Где то в недрах програмы создаётся слушающий сокет, который забинден на определённый порт. При запуске скрипта дескриптор сокета наследуется этим скриптом. Останавливается программа нормально, а запуститься заново не получиться, поскольку нельзя забиндить этот порт вторично.

platerx
() автор топика
Ответ на: комментарий от platerx

Можно написать пргу-обёртку, постоянно рестартующую дохнущую (например по сигналу) большую прогу, а в плагине закрывать большую прогу. Так исходная среда чище будет :]. Возможно, Вам также поможет man 7 socket SO_REUSEADDR.

sf ★★★
()
Ответ на: комментарий от sf

Спасибо за советы! Оберту написать не получиться поскольку кроме функции перезапуска плагин выполняет ещё функцию остановки. А опцию SO_REUSEADDR, использовать не получиться, поскольку текст основной проги менять очень не желательно.

platerx
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.