swg2you 403 Опубликовано: 21 июня, 2015 (изменено) Подмена computer.pullSignal или методика построения резидентных программ в OpenOS Допустим, захотелось нам иметь резидентную программу, которая будет работать на фоне OpenOS и, периодически, или по какому либо событию, что-то полезное делать. Воспользуемся нашим маленьким bibi, а в качестве boot.lua напишем такой код: local cl=component.list local gp=component.proxy(cl("gpu")()) --сохраняем исходные функции из _G.computer, для внутреннего пользования local cp={} for k,v in pairs(computer) do cp[k]=v end --подменяем функцию computer.pullSignal computer.pullSignal = function (...) local e={cp.pullSignal(...)} --для примера, по тильде (~) будем ребутать компьютер if e[1]=='key_down' and e[4]==41 then cp.shutdown(true) end --а по lAlt будем выводить список компонентов используя определенную в OpenOS функцию print и сохраненную cl if e[1]=='key_down' and e[4]==56 then for k,v in cl() do print(k,v) end end --OpenOS периодически сама дергает эвенты (чтобы курсор мигал и прочее) подробнее смотрите в lib/event.lua --поэтому мы можем выводить свои часики, куда-ж без них то ) и прочие полезности, например инфу о памяти local s=tostring(math.floor(cp.freeMemory()/1024))..'/'..tostring(cp.totalMemory()/1024)..' kb free '..os.date('!%R') local w,h = gp.maxResolution() gp.set(w-#s+1,1,s) --в конце мы должны вернуть событие ничего не подозревающей OpenOS return table.unpack(e) end --функцию мы подменили, теперь загружаем, компилируем и выполняем init.lua local fs=component.proxy(computer.getBootAddress()) local h=fs.open('init.lua') local s,r='','' while r do r=fs.read(h,math.huge) s=s..(r or "") end fs.close(h) load(s)() Запускаем компьютер, bibi пискнув и подождав секундочку, выполняет наш boot.lua, который хитро подменив pullSignal выполнит init.lua и после загрузки OpenOS в углу экрана радостно затикают часики. Теперь мы можем нажать lAlt и лицезреть список компонентов, или нажать тильду, и компьютер перезапустится. --==-- Конечно, вы можете сказать, что вывод списка компонентов портит экран, что перед выводом хорошо бы сохранять состояние экрана каким-нибудь gpu.get, вывод делать в свой интерфейс, а после, восстанавливать экран. И часики у меня никудышние. При скролле вниз (например в редакторе edit.lua) скроллируются вместе с текстом, вместо того, чтобы оставаться там где им положено. Но моя задача, показать метод на простейших примерах, а не переопределяя gpu строить интерфейсы. На основе этого метода можно построить API для TSR программ, а комбинируя его с перехватом component.proxy, component.invoke и последующей подменой gpu на виртуальный терминал, и вовсе, написать свою операционную систему. Для которой, кстати говоря, было бы неплохо уметь запускать OpenOS в окошке, но самое главное, в изолированной среде, чтобы труд программистов писавших ПО под OpenOS не пропадал зря. Я бы даже сказал, что изоляция OpenOS, на данном этапе, более важная задача, чем построение интерфейсов. Поэтому мы попробуем разобрать эту проблему в следующей статье. Посмотрим что выйдет. --==-- Небольшое дополнение: Если вам не охота играть с bibi, но нужно запустить резидентную программу прямо из-под OpenOS, то это сделать еще проще. local component = require("component") local cp = require("computer") local gpu = component.gpu local pullSignal = cp.pullSignal cp.pullSignal = function (...) local e={pullSignal(...)} if e[1]=='key_down' and e[4]==41 then cp.shutdown(true) end if e[1]=='key_down' and e[4]==56 then for k,v in component.list() do print(k,v) end end local s=' '..math.floor(cp.freeMemory()/1024)..'/'..(cp.totalMemory()/1024)..' kb free '..os.date('!%R') local w,h = gpu.maxResolution() gpu.set(w-#s+1,1,s) return table.unpack(e) end Сохраняем этот код в файл, допустим tsr.lua и запускаем его под OpenOSПрограмма выполнится, завершится, а резидентный участок останется в памяти. --==-- Если выбросить все что относится к демонстрации работы, у нас останется маленькая обертка local cp = require("computer") local pullSignal = cp.pullSignal cp.pullSignal = function (...) local e={pullSignal(...)} --код TSR программы return table.unpack(e) end Заключив в которую код своей TSR программы мы получим резидента, который будет выполнять TSR-код, где-то раз в пол секунды. Изменено 21 июня, 2015 пользователем swg2you 9 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 21 июня, 2015 Это круто! Я все никак не мог сообразить, как такое провернуть, спасибо, чувак! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you Автор темы 403 Опубликовано: 21 июня, 2015 (изменено) Это круто! Я все никак не мог сообразить, как такое провернуть, спасибо, чувак!Пожалуйста, чувак ) upd: перенес дополнение в первый пост Изменено 21 июня, 2015 пользователем swg2you Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy 1 169 Опубликовано: 21 июня, 2015 Неплохо, но похоже, я догадываюсь к чему это всё идет. Еще немного и swg2you напишет свою ось. Ось для Биосов. А что, слабо написать ось на 4к памяти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 21 июня, 2015 Неплохо, но похоже, я догадываюсь к чему это всё идет. Еще немного и swg2you напишет свою ось. Ось для Биосов. А что, слабо написать ось на 4к памяти? Все идёт к тому что я собираюсь открыть проект MNL (MNL's Not Linux), копию ядра линукс, только под Lua Opencomputers и со своим преферансом и мормуазелями. И писать на биосе по мне --- тупиковая ветвь развития. Все упрется в то, что ты достигнет лимита. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 21 июня, 2015 Все идёт к тому что я собираюсь открыть проект MNL (MNL's Not Linux), копию ядра линукс, только под Lua Opencomputers и со своим преферансом и мормуазелями. И писать на биосе по мне --- тупиковая ветвь развития. Все упрется в то, что ты достигнет лимита. Открыть и забыть. Интересное решение. Неплохо, но похоже, я догадываюсь к чему это всё идет. Еще немного и swg2you напишет свою ось. Ось для Биосов. А что, слабо написать ось на 4к памяти? ОСь загруженная в темпе из инета (и/или по ОпенНет) и запускаемая из-под биоса... Интересно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 21 июня, 2015 ОСь загруженная в темпе из инета (и/или по ОпенНет) и запускаемая из-под биоса... Интересно) Вот и Сони так думают. Вон уже консоли в сервера несут, будет так: проплатил - играешь, не проплатил - не играешь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 22 июня, 2015 swg2you, я смотрю, ты как и некоторые здесь, любитель переопределять системные функции. Предлагаю тебе и другим желающим реализовать совместно проект FTP. Для доступа к дисковому пространству удаленного компьютера по вайфаю или ОпенНет. Это должна быть резидентная программа, которая подменяет функции библиотеки filesystem таким образом, что обращение к папке, расположенной на другом компьютере, выглядит как работа с локальным диском. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 22 июня, 2015 swg2you, я смотрю, ты как и некоторые здесь, любитель переопределять системные функции. Предлагаю тебе и другим желающим реализовать совместно проект FTP. Для доступа к дисковому пространству удаленного компьютера по вайфаю или ОпенНет. Это должна быть резидентная программа, которая подменяет функции библиотеки filesystem таким образом, что обращение к папке, расположенной на другом компьютере, выглядит как работа с локальным диском. Я когда-то под CC такое делал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 22 июня, 2015 Я тоже делал. А вот на ОС решил и чую, зарываюсь. Намного сложнее тут ось построена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 22 июня, 2015 Разве OpenCloud не заменит функции ftp? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 22 июня, 2015 Разве OpenCloud не заменит функции ftp? Какой OpenCloud?? Во-первых, вы его никогда, похоже, не допишете. Во-вторых, не путай FTP с облаком. Это две разные вещи! В первом случае — это резидентная программа, а во втором — интерфес мост — сервер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 22 июня, 2015 Какой OpenCloud?? Во-первых, вы его никогда, похоже, не допишете. Во-вторых, не путай FTP с облаком. Это две разные вещи! В первом случае — это резидентная программа, а во втором — интерфес мост — сервер. Ага не допишем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 22 июня, 2015 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 22 июня, 2015 Ага не допишем. Тогда полный вперёд. А то прогресс стоит, ничего не делается. Кстати, посмотрите на тему. Потом на сообщение своё. Потом снова на тему. Потом на Правила. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you Автор темы 403 Опубликовано: 22 июня, 2015 2@Krutoy >...А что, слабо написать ось на 4к памяти? 34816 бит, без учета "имени", это довольно много. 2@LeshaInc >...И писать на биосе по мне --- тупиковая ветвь развития... тупиковая - не писать. 2@Fingercomp >...ОСь загруженная в темпе из инета (и/или по ОпенНет) и запускаемая из-под биоса... Интересно) Биос такой, - Сосед, а сосед, ты один пинганулся на этом порту, а дай мне код операционки, чтоб я в инет сам не лез! - Ты офигел? я вообще-то дрон и у меня ос, из других модулей состоит. Хочешь дроном стать? - Дроном мне не судьба. Максимум - роботом, - Рожденный ползать... - как там говорится. - Летать не может, - там говорится. - Ну слетай к кому нибудь, принеси, а? - Ага, щас. С инета тяни. Или жди пока еще кто из твоей породы проснется и потянет. - Так хозяин инет-карту куда й то запропастил. Вчерась еще была, а сегодня - тык, - нету! 2@Zer0Galaxy >...Это должна быть резидентная программа,... как минимум две. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
davial 1 972 Опубликовано: 25 июня, 2015 У одного меня родилась ассоциация : " Резидентная программа --> Вирус " ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you Автор темы 403 Опубликовано: 25 июня, 2015 У одного меня родилась ассоциация : " Резидентная программа --> Вирус " ? Это один из вариантов использования резидентных программ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
davial 1 972 Опубликовано: 25 июня, 2015 (изменено) Это один из вариантов использования резидентных программ. Мне больше это нравится https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BC%D0%BE%D0%BD_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%29 Изменено 25 июня, 2015 пользователем davial Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asummonster 592 Опубликовано: 25 июня, 2015 Мне больше это нравится https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BC%D0%BE%D0%BD_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%29 Из того,что я прочитал - такой демон может отвечать,к примеру,на автоматическое монтирование дисков(ивент peripheralAdded, на сколько я помню), автоматически прогружать в глобал АПИ компонентов(что бы каждый раз не писать modem=component.modem), работать корзиной и т.п. Вобщем - может быть не только вирусом. Часики swg тоже демон,в винде его бы назвали "служба гаджета часов" 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах