Чи ці програми на основі GUI також виконують ту саму команду у фоновому режимі?
Так і ні. Вони записують у dconf
базу даних налаштувань, але для цього вони можуть використовувати різні способи. Програми, написані на Python, швидше за все, використовуватимуть gi.repository.Gio
модуль (я знаю, тому що я його дуже багато використовую), або вони можуть замість цього використовувати gsettings
як зовнішню команду шляхом виклику subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
, і в основному вона буде працювати як команда оболонки. Програма змінного струму використовуватиме щось подібне, ймовірно, gio.h
бібліотеку, або навіть може використовувати exec()
сімейство функцій, щоб зробити те саме, що Popen
і в python. Отже, щоб відповісти на ваше заголовкове запитання: "Чи виконує програма на основі GUI команди оболонок у фоновому режимі?" Вони можуть, але, ймовірно, це не потрібно, тому що існує бібліотека для будь-якої мови, на якій написано додаток, і, ймовірно, використовувати функцію бібліотеки буде трохи швидше, ніж нерестувати новий процес.
Щоб дати вам зразок того, як це робиться з бібліотеками / модулями, сміливо перегляньте вихідний код індикатора мого списку запуску. Там я написав функцію створити екземпляр 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'
створити новий файл на робочому столі за допомогою ярлика. Це особливо цікавий приклад, оскільки ви можете використовувати змінну оболонки, оскільки явно ви використовуєте оболонку.