как сделать так чтобы при запуске программы например GLOB_exe переменная int var_glob увеличивалась на один и выводила ее содержание пример запуска : ./GLOB_exe //первый запуск результат = 0 ./GLOB_exe //второй запуск результат = 1 ./GLOB_exe //третий запуск результат = 2 ./GLOB_exe //четвертый запуск результат = 3 ????? помогите .
Есть вариант сохранять переменную в файл, после считывать, и проводить необходимые манипуляции. Второй вариант, запускать программу как дочерний процесс с передачей параметров. Также можно устанавливать соединение с программой в котрой храняться данные нужные данные и получать их с помошью сокетов или пайпов, ну и еще вариант хранить данные в БД, например MySQL
а возможен такой вариант хранения значения в переменных окружения ? а вообще мне надо сделать так чтобы после пятого запуска программа выдавала сообщение о том что запуск не возможен .
В переменных окружения хранить можно но не желательно, так как там в основном храниться ситемная информация.
Sasha1111 Нет. Переменные окружения копируются от родительского процесса дочернему в момент создания этого дочернего процесса. И наша программа, которая дочерний процесс шелла, должна менять значения переменных окружения в родительском процессе, чтобы эти изменения коснулись бы последующих запусков. Заведи файлик с именем $HOME/.GLOB_exe.rc и храни там число запусков.
Тоже самое, что мешает вытащить себя за волосы. Выполняемый файл закрыт на запись в момент выполнения.
Отмапить файл из памяти (или подождать завершения процесса-родителя), а потом - меняй, что хочешь. Для Linux. Для винды - посмотрите, как устроены самоудаляющиеся exe-шки.
herm1t Любите сложные пути? Которые работают лишь иногда? И отказываются работать тогда, когда бинарь запущен без прав записи "в себя"? Кстати это наиболее распространённая ситуация в *nix: все бинари имеют владельца root и писать в них может только он, а запускаются процессы от имени других пользователей. Надо просто создать файлик, и в нём хранить количество записей. Если этот способ слишком прост для столь продвинутой аудитории, то существуют библиотеки типа gconf и пр., которые хранят бд настроек программ.
Под виндами - самоудаление и самопереименование экзешников это ведь не самоизменение. Содержимое выполняющегося в данный момент exe-файла однозначно недоступно для записи, хотя переименовать его в этот момент возможно (насчет удалить точно не знаю). Интересно было бы услышать исходную цель топикстартера - для чего ему надо подсчитывать количество запусков? И почему ему не годится простой и очевидный способ - через файл данных в директории экзешника, например? Может быть вообще его исходная задача решается не подсчетом количества запусков, а каким-то другим путем?
Dmitry_Milk Я пробовал закрывать все открытые хендлы, размапливать фаил и вызывать NtDeleteFile результат C0000121 STATUS_CANNOT_DELETE. В старых версиях винды такое говорят работало. Я думаю он хочет сделать, что то типа защиты, например что бы его прогу можно было опробовать пять раз, а на шестой она должна будет просить вас оплатить её для дальнейшей работы.
Кстати, в догонку, а есть какие-нибудь готовые библиотечные решения для эмуляции персистентных данных как обычных оперативных? То есть, программа работает с нектоторым объектом или переменной как будто с обычной переменной, но тем не менее значение переменной в какие-то моменты времени синхронизируется со значением в какой-то внешней базе или файле, и чтоб происходило это прозрачно для пользовательской программы? Или фактически достаточно маппинга файла на память?