Force_Majeure
написал 3 сентября 2005 года в 09:20 (726 просмотров)
Ведет себя
как мужчина; открыл 2 темы в форуме, оставил 10 комментариев на сайте.
Наисал простейшего демона раздвоив процесс через fork() и setsid(), родительский процесс завершился, в потомке — бесконечный цикл while. Подскажите, как теперь сделать передачу команд демону из конандной строки? Например, как системным демонам пишешь, service iptables stop и iptables завершается. Как сделать, чтобы мой демон тоже мог воспринимать команды?
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
команда service iptables stop на самом деле вызывает /etc/init.d/iptables, в котором и реализовано данное управления. :))
правда, не всегда это удобно именно таким образом, но кто его знает.
вообще же, сильно рекомендуется к прочтению «Inter-process communication» («Взаимодействие процессов») (у меня, правда, на примете нет таких описаний, но кто-нибудь ссылку да подкинет)
Так не обязательно именно таким способом, я же его в качестве примера привел. Но как-то управлять демоном нужно же. Как передать демону хотя бы простейшую команду завершить работу?
ловить в демоне сигнал SIGQUIT — стандартный сигнал завершения работы.
принято так же обрабатывать SIGINT — перечитать конфигурацию.
вообще же, как я уже и сказал, тебе нужно поискать и почитать про IPC механизмы.
к примеру, на том же <font color=«blue»>Opennet.ru</font>
Т.е. получается, что «общаться» с демоном можнотолько посредством отправки ему сигналов?
Вот еще такой вопрос появился. Я пишу на С++. При использовании ф-ции fork(), как я понимаю, создается вторая копия данных для новой нити процесса. Если я до вызова fork() создал динамический объект MyClass* MyCls = new MyClass(); я по логике должен вызвать деструктор для него delete MyClas; два раза, для нити-предка и для нити-потомка. А как быть если я создавал динамические объекты раньше, во время вызова fork() это неизвесно и налицо будет огромная утечка памяти. Как тут быть?
можно сделать exec.
а прочитать предложенное было не судьба?
лениво?
или что???
способов — несколько. И ВСЕ ОНИ ОПИСАНЫ. и называются общим словом «Взаимодействие процессов», IPC.
ЧТО ТУТ НЕПОНЯТНОГО???!
Я прочитал и про каналы и про сигналы и про очереди сообщений и про совместное пользование памятью и про управление через сокеты. Это все теория. А на форумах обычно подсказывают то, что реально используют в программах. Ты сам, например, какой способ используешь?
а как ты думаешь зачем так много способов IPC? наверное, потому, что универсального способа не существует. Ну посоветую я тебе псеводтерминал использовать — поможет? Или может pipe тебе будет удобнее? Здесь же нету телепатов, и никто не знает чем твой демон занимается и какие команды надо ему передавать.
Это не теория, это самая что ни на есть практика. :-)
Каждый способ хорош для какой-то конкретной задачи, для нее он и используется.
Тебе надо точно определить структуру своей программы, ты увидишь, какой способ тебе лучше всего применить.
Например, если необходимо полноценное общение с форканутым проессом — передача структурированных данных, чтение из командной строки и пр. — то можно создать две пайпы между родителем и ребенком. Родитель тогда не выходит, а ждет завершения работы ребенка, читая командную строку и передавая ему информацию.
Если нужно только передать форканутому процессу одну-две команды (stop/restart), тогда родитель может выйти, но pid нового процесса надо сохранить в файле. Тогда твой командный интерфейс вызовется, прочитает pid из этого файла и пошлет нужный сигнал демону.
Взаимодействие форканутых процессов и их родителей может быть и весьма сложным. Если ты правильно представляешь, как именно они должны общаться, ты поймешь, что именно тебе нужно — очередь, общая память, fifo или что-то еще.
Я давал такие упражнения своим студентам — сделать чатовый сервер и чатовый клиент для клмандной строки и устроить между ними общение. Главное тут — строгая структуризация алгоритма. Как только ты точно знаешь, чтО тебе надо, ты увидишь, кАк это сделать.
А по поводу объектов, которые создаются до форка, да, они копируются потомком, и там их надо тоже уничтожать. Отслеживай. Только аккуратно.
pointer = new myclass()
в ребенке будет указывать в пустоту… Подумай, почему. :-)
Good Luck,
UT
Мне нужен типовой вариант демона.
Ближе всего к этому варианту. Командный интерфейс — что имеется ввиду? Скрипт в /etc/init.d/с командами?
Не понял, с какой стати? Если память основного процесса копируется, указатели должны переопределиться на новый участок памяти и pointer впотомке будет указывать на другой экземпляр класса MyClass. Если я не прав, поясни, пля.
Купи книжу Стивенса «UNIX: взаимодействие процессов» и «Разработка сетевых приложений в UNIX».
Там это все описано замечательно, с примерами и пояснениями.
Что такое «пля»? Уж больно на «бля» похоже…
Я извиняюсь, что из меня иногда в самый неподходящий момент вылезает препод, но должен заметить, что ты взялся за дело несколько не с того конца.
Напиши парочку простеньких программулек с fork()’ом — поиграйся, посмотри, как он работает. Если чего-то не поймешь, и в книгах про это нет, спроси здесь, твоя программулька будет конкретнвм примером. То же — с разными способами передачи данных.
Извини, но твои оторванные от контекста теоретические рассуждения подвигают народ только на очередной RTFM. Ну а что еще можно сказать?
Не надо пытаться проглотить большой проект одним куском, особенно если ты не понимаешь большого количества деталей.
Good Luck,
UT
2 LONGOBARD
Вторая книжка у меня есть, ей и руководствуюсь. Того чего не понимаю — спрашиваю.
2 Uncle Theodore
Прошу прощения, «пля» — это «плz» (сокращение от пожалуйста), раскладку случайно не перекючил.
Так я и делаю, написал простейшую программу (hello word :) ) и далее подгоняю ее под свои нужды. С fork() поэкспериментировал отдельно, все правильно, указатель в потомке указывает на копию данных а не на NULL.
А вот конкретный участок кода, который вызвает затруднения:
А тебе нужна прежде всего первая книжка :) Вопросы IPC во второй освещены весьма поверхностно
Видимо в силу врожденной тупости я так и не могу понять как использовать межпроцессное взаимодействие. Вот участок кода:
Подскажите, если я в функции GetData(ConnectinId) получаю скажем строку «QUIT» для завершения всей программы, каким способом мне сделать Listening=false в процессе, который крутит цикл while(Listening==true) чтобы корректно выйти из программы?
Посмотри http://www.ecst.csuchico.edu/~beej/guide/net/html/clientserver.html#simpleserver
Там хороший пример сервера.
Good Luck,
UT
2 Uncle Theodore
В этом примере (как и во многих других, что я находил в и-нете) процесс просто рубится по exit(0). В man’е не сказано что exit(0) очищает динамически выделенную память, значит все остается неподчищенным?
Офигеть…Ты эт чего IPC теорией обзываешь то..
Тебе дельный совет дали.. И не какая это не теория Гыы..