Подскажите горе-программеру под Линухом. :)

Модератор: Модераторы разделов

Ответить
zloyvov
Сообщения: 2

Подскажите горе-программеру под Линухом. :)

Сообщение zloyvov »

Может кто знает? Есть ли какое-то стандартное средство в Юнихе, чтобы рестартануть прогу из самой себя. То есть выполняется прога (допустим на С++), а потом она хочет перезапуститься, чтобы начать всё как бы с чистого листа (шоб закрыты были все файловые дескрипторы, выполнены все деструкторы, освобождён весь мусор из памяти и т.д.). В общем типа как можно сделать самоперезагрузку проги?
Спасибо сказали:
Аватара пользователя
JaGoTerr
Сообщения: 380

Re: Подскажите горе-программеру под Линухом. :)

Сообщение JaGoTerr »

Упс... понаписал тута... а потом понял, что ты хочешь чего-то "стандартного". Типа системный вызов такой? Не знаю точно, но интуитивно догадываюсь, что нету.
Спасибо сказали:
Аватара пользователя
Valerius
Бывший модератор
Сообщения: 1469
Статус: Отпетый КДЕ'шник

Re: Подскажите горе-программеру под Линухом. :)

Сообщение Valerius »

Самый простой вариант, наверно будет такой - запускаеш её из скрипта. Если проге нужно "перезапуститься" она выходит с определённым кодом ошибки. Скрипт его определяет и запускает прогу опять.
Свобода есть тонкая полоска между диктатурой и анархией.

---------------------
Mandriva Linux PowerPack 2006 (Cooker-нутая) / KDE-3.5.1
Спасибо сказали:
Аватара пользователя
Gloomy
Сообщения: 340
Статус: сочувствующий

Re: Подскажите горе-программеру под Линухом. :)

Сообщение Gloomy »

zloyvov
Попробуй сначала запустить из работающей программы Х второй ее экземпляр а потом завершить выполнение программы Х.

Функция system передает строку s операционной системе для выполнения.

Код: Выделить всё

int system(const char *s);

Источник: "Язык программирования С" (Б. Керниган, Д. Ритчи), стр. 325.
Спасибо сказали:
Аватара пользователя
svyatogor
Сообщения: 33
Контактная информация:

Re: Подскажите горе-программеру под Линухом. :)

Сообщение svyatogor »

Я бы так сделал. Основная программа, запускаема пользователем - это только загрузчик. Он запускает основную прогу и слушает событие типа рестарт. Если надо - убовает прогу и включает по новой.
Fire within me!
Спасибо сказали:
quinn
Сообщения: 9

Re: Подскажите горе-программеру под Линухом. :)

Сообщение quinn »

Можно поробовать exec() себя. Путь получить из args[0].
Спасибо сказали:
Аватара пользователя
MDK_User
Сообщения: 118
ОС: OpenSUSE 11.2

Re: Подскажите горе-программеру под Линухом. :)

Сообщение MDK_User »

(quinn @ Wednesday, 21 July 2004, 15:46) писал(а):Можно поробовать exec() себя. Путь получить из args[0].

Да, по идее должно сработать - exec без fork - это то, что нужно... вроде бы :)
Спасибо сказали:
Аватара пользователя
Golden
Сообщения: 163
ОС: Ubuntu Linux 7.10
Контактная информация:

Re: Подскажите горе-программеру под Линухом. :)

Сообщение Golden »

(MDK_User @ Wednesday, 21 July 2004, 20:09) писал(а):
(quinn @ Wednesday, 21 July 2004, 15:46) писал(а):Можно поробовать exec() себя. Путь получить из args[0].

Да, по идее должно сработать - exec без fork - это то, что нужно... вроде бы :)


Я конечно C знаю плохо, но весь мой опыт программирования на других языках говорит мне, что вызов exec() попросту положит весь текущий контекст в стек, выполнит новый экземпляр, после чего поднимется из стека и продолжит работу.
Насколько я знаю (а знаю я пока мало :() только fork() порождает новый процесс, но тут он ИМХО не проходит.
Извините, ежели сморозил глупость.

Больше всего мне понравился вариант со скриптом и кодом завершения.
Еще могу предложить запланировать при помощи at выполнение проги через 3 секунды (или сколько вам там надо), после чего спокойно выйти.
Спасибо сказали:
Аватара пользователя
deisler
Сообщения: 250

Re: Подскажите горе-программеру под Линухом. :)

Сообщение deisler »

В shell это делается так: exec $0
Всех благ.
Спасибо сказали:
Аватара пользователя
MDK_User
Сообщения: 118
ОС: OpenSUSE 11.2

Re: Подскажите горе-программеру под Линухом. :)

Сообщение MDK_User »

В Unix/Linux вроде так:
fork порождает копию текущего процесса - отсюда и выражание "форкнуть"
exec же заменяет текущий процесс (тот процесс, из которого он запеускается) новым
Поэтому типичный запуск нового процесса это совмещение
fork ()
exec ()

А только exec () заменит текущий процесс на новый
Но новый - это может быть рестартнутый текущий, если поставить первый аргумент командной строки argv[0]
Извините, если для кого-то это банальности
Спасибо сказали:
Ответить