LINUX.ORG.RU

Сообщения ioncore

 

fork/exec и взаимодействие процессов

Всем привет. Возник тут такой вопрос к товарищам с опытом системного программирования.
C++. Есть демон, который висит на порту и слушает входящие сокеты - читает/обрабатывает/отвечает. Реализация очереди - на libev. Время обработки запроса - в пределах нескольких секунд, однако некоторые запросы требуют выполнения громоздких (по времени исполнения) команд в шелл - в таких ситуациях нужно:
а) перевести демон в определенное состояние;
б) запустить отдельным тредом выполнение команд
в) отдать клиенту ответ и закрыть сокет;
г) во время выполнения команд продолжать обработку запросов;
д) после выполнения команд перевести демон в исходное состояние;
е) продолжать обработку запросов.
Для запуска команд запускаю тред, в котором вфоркаюсь (где child выполняет execl, а parent пишет ответ в сокет) и у child убиваю все открытые дескрипторы (для того, чтобы parent смог ответить клиенту и закрыть сокет не ожидая завершения execl).
Корявость возникла с "д)" - переводом демона в исходное состояние после отработки команд: для того, чтобы child смог дать отмашку parent-у, пришлось в последний добавить обработчик SIGUSR1, а в список команд, выполняемых execl в child, добавить "kill -10 parentpid" (parentpid получаю перед форканьем). Все отлично работает, но решение мне не нравится - если таких состояний будет не 1-2, а сотня, то сигналов уже не хватит + не покидает ощущение, что ломлюсь в открытые ворота. Может быть можно эту проблему решить как-то по-другому, проще? Oрганизовать межпроцессную связь через FIFO или pipe нельзя, т.к. все ранее открытые дескрипторы у child нужно закрывать после форка. А нельзя ли как-то организовать выполнение системных команд в треде этого же процесса вообще без форка/вфорка?

ioncore
()

RSS подписка на новые темы