Подскажите горе-программеру под Линухом. :)
Модератор: Модераторы разделов
-
zloyvov
- Сообщения: 2
Подскажите горе-программеру под Линухом. :)
Может кто знает? Есть ли какое-то стандартное средство в Юнихе, чтобы рестартануть прогу из самой себя. То есть выполняется прога (допустим на С++), а потом она хочет перезапуститься, чтобы начать всё как бы с чистого листа (шоб закрыты были все файловые дескрипторы, выполнены все деструкторы, освобождён весь мусор из памяти и т.д.). В общем типа как можно сделать самоперезагрузку проги?
-
JaGoTerr
- Сообщения: 380
Re: Подскажите горе-программеру под Линухом. :)
Упс... понаписал тута... а потом понял, что ты хочешь чего-то "стандартного". Типа системный вызов такой? Не знаю точно, но интуитивно догадываюсь, что нету.
-
Valerius
- Бывший модератор
- Сообщения: 1469
- Статус: Отпетый КДЕ'шник
Re: Подскажите горе-программеру под Линухом. :)
Самый простой вариант, наверно будет такой - запускаеш её из скрипта. Если проге нужно "перезапуститься" она выходит с определённым кодом ошибки. Скрипт его определяет и запускает прогу опять.
Свобода есть тонкая полоска между диктатурой и анархией.
---------------------
Mandriva Linux PowerPack 2006 (Cooker-нутая) / KDE-3.5.1
---------------------
Mandriva Linux PowerPack 2006 (Cooker-нутая) / KDE-3.5.1
-
Gloomy
- Сообщения: 340
- Статус: сочувствующий
Re: Подскажите горе-программеру под Линухом. :)
zloyvov
Попробуй сначала запустить из работающей программы Х второй ее экземпляр а потом завершить выполнение программы Х.
Функция system передает строку s операционной системе для выполнения.
Источник: "Язык программирования С" (Б. Керниган, Д. Ритчи), стр. 325.
Попробуй сначала запустить из работающей программы Х второй ее экземпляр а потом завершить выполнение программы Х.
Функция system передает строку s операционной системе для выполнения.
Код: Выделить всё
int system(const char *s);Источник: "Язык программирования С" (Б. Керниган, Д. Ритчи), стр. 325.
-
svyatogor
- Сообщения: 33
Re: Подскажите горе-программеру под Линухом. :)
Я бы так сделал. Основная программа, запускаема пользователем - это только загрузчик. Он запускает основную прогу и слушает событие типа рестарт. Если надо - убовает прогу и включает по новой.
Fire within me!
-
quinn
- Сообщения: 9
Re: Подскажите горе-программеру под Линухом. :)
Можно поробовать exec() себя. Путь получить из args[0].
-
MDK_User
- Сообщения: 118
- ОС: OpenSUSE 11.2
Re: Подскажите горе-программеру под Линухом. :)
(quinn @ Wednesday, 21 July 2004, 15:46) писал(а):Можно поробовать exec() себя. Путь получить из args[0].
Да, по идее должно сработать - exec без fork - это то, что нужно... вроде бы
-
Golden
- Сообщения: 163
- ОС: Ubuntu Linux 7.10
Re: Подскажите горе-программеру под Линухом. :)
Я конечно C знаю плохо, но весь мой опыт программирования на других языках говорит мне, что вызов exec() попросту положит весь текущий контекст в стек, выполнит новый экземпляр, после чего поднимется из стека и продолжит работу.
Насколько я знаю (а знаю я пока мало
Извините, ежели сморозил глупость.
Больше всего мне понравился вариант со скриптом и кодом завершения.
Еще могу предложить запланировать при помощи at выполнение проги через 3 секунды (или сколько вам там надо), после чего спокойно выйти.
-
deisler
- Сообщения: 250
-
MDK_User
- Сообщения: 118
- ОС: OpenSUSE 11.2
Re: Подскажите горе-программеру под Линухом. :)
В Unix/Linux вроде так:
fork порождает копию текущего процесса - отсюда и выражание "форкнуть"
exec же заменяет текущий процесс (тот процесс, из которого он запеускается) новым
Поэтому типичный запуск нового процесса это совмещение
fork ()
exec ()
А только exec () заменит текущий процесс на новый
Но новый - это может быть рестартнутый текущий, если поставить первый аргумент командной строки argv[0]
Извините, если для кого-то это банальности
fork порождает копию текущего процесса - отсюда и выражание "форкнуть"
exec же заменяет текущий процесс (тот процесс, из которого он запеускается) новым
Поэтому типичный запуск нового процесса это совмещение
fork ()
exec ()
А только exec () заменит текущий процесс на новый
Но новый - это может быть рестартнутый текущий, если поставить первый аргумент командной строки argv[0]
Извините, если для кого-то это банальности