Эти приложения на основе графического интерфейса также выполняют ту же команду в фоновом режиме?
Да и нет. Они пишут в dconf
базу данных настроек, но могут использовать разные способы для этого. Программы, написанные на Python, вероятно, будут использовать gi.repository.Gio
модуль (я знаю, потому что я часто его использую), или вместо этого они могут использовать его gsettings
как внешнюю команду, вызывая ее subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
, и он будет в основном работать как команда оболочки. Программа AC будет использовать нечто подобное, скорее всего, gio.h
библиотеку, или она может даже использовать exec()
семейство функций для того же, что Popen
и в python. Итак, чтобы ответить на ваш заглавный вопрос: "Приложение на основе графического интерфейса выполняет команды оболочки в фоновом режиме?" Они могут, но, вероятно, в этом нет необходимости, потому что есть библиотека для любого языка, на котором написано приложение, и, вероятно, будет немного быстрее использовать библиотечную функцию, чем порождать новый процесс.
Чтобы дать вам пример того, как это делается с библиотеками / модулями, не стесняйтесь взглянуть на исходный код индикатора моего списка запуска. Там я написал функцию для создания экземпляра Gio.Settings
класса, а затем использую его для изменения модуля запуска Unity в зависимости от типа списка, который вы хотите иметь там.
Как заглянуть во внутреннюю работу этих приложений? Я имею в виду, есть ли способ на самом деле смотреть на команды, которые выполняются при каждом нажатии кнопки?
Нет. Если вы хотите увидеть, какая команда выполняется на языке программирования этого приложения, когда вы нажимаете кнопку или нажимаете на элементы окна, это невозможно. Прочитайте исходный код приложения, если есть возможность его получить. Вы можете использовать, dconf watch /
чтобы увидеть, какие настройки меняются, а не как это делается.
Технически, если вы знаете, как работать с отладчиком, читать адреса памяти и знать некоторый язык ассемблера, то вы можете знать, что приложение делает на уровне процессора и памяти. Это называется реверс-инжинирингом программного обеспечения и часто используется специалистами по безопасности для анализа вредоносного программного обеспечения и обнаружения уязвимостей в легальном программном обеспечении.
Эти приложения открывают терминал в фоновом режиме и выполняют эти команды?
Нет, нет подключенного терминала. Многие программы знают, где находится dconf
база данных для пользователя и пишут туда. Существует также межпроцессная коммуникационная шина, известная как dbus
, где программы могут отправлять сигналы, и программа будет выглядеть как «Эй, это сообщение для меня!»
добавление
Могут ли приложения запускать другие приложения? Да, это делается с помощью стандартных fork()
и execve()
системных вызовов. Суть создания процессов в Linux и других * nix системах в значительной степени основана на этих двух. Механизм оболочки для запуска не встроенных команд использует это особенно. Когда вы работаете в интерактивном режиме
$ ls
оболочка создаст новый процесс через fork()
, этот процесс будет запущен, execve()
который запустится ls
. Из-за того execve()
, каким будет этот новый раздвоенный процесс ls
. pipe()
Системный вызов , что поможет считан выходу ls
. Я настоятельно рекомендую прочитать мой ответ «В чем разница между конвейером и перенаправлением, чтобы понять, как работает конвейерный механизм - это не просто |
оператор, а фактически системный вызов».
Могут ли приложения запускать команды оболочки? Нет. Синтаксис оболочки понимается только самой оболочкой. Однако вы можете запустить оболочку с параметром командной строки -c
и предоставить соответствующие команды. Это часто используется для пользовательских ярлыков, установленных в GNOME или других средах рабочего стола, поскольку настраиваемые ярлыки работают на исполняемых файлах, и нет оболочки для понимания синтаксиса. Таким образом, в качестве примера, вы могли бы сделать bash -c 'xdotool key Ctrl+Alt+T'
косвенный запуск xdotool
команды или bash -c 'cd $HOME/Desktop; touch New_File'
создать новый файл на рабочем столе с помощью ярлыка. Это особенно интересный пример, поскольку вы можете использовать переменную оболочки, поскольку вы используете оболочку явно.