Saya telah bermigrasi ke Ubuntu 16.04 hanya 2 hari yang lalu dari Windows. Saya suka cara kita menyesuaikan Desktop Unity. Saya hanya bermain-main dengan tampilan dan nuansa lingkungan Desktop. Sama seperti di Windows, saya ingin peluncur berada di bagian bawah layar. Di Googling, saya menemukan perintah yang berbunyi seperti:
gsettings set com.canonical.Unity.Launcher launcher-position Bottom
Juga, ada unity-Tweak-tool dan editor dconf untuk menyelesaikan pekerjaan. Tapi ini adalah pendekatan GUI untuk menyelesaikan sesuatu.
Pertanyaan saya adalah:
- Apakah aplikasi berbasis GUI ini juga menjalankan perintah yang sama di latar belakang?
- Bagaimana cara mengintip kerja internal aplikasi ini? Maksud saya, apakah ada cara untuk benar-benar melihat perintah yang dijalankan di setiap klik tombol?
- Apakah aplikasi ini membuka terminal di latar belakang dan menjalankan perintah ini?
Jawabannya di sini memberi tahu cara mendapatkan deskriptor file standar proses. Tapi, saya tidak mendapatkan apa pun di output.
Selain itu, strace -p pid -o output.txt
perintah melempar sejumlah besar teks ke dalam file.
Jadi, singkatnya, apakah melakukan sesuatu menggunakan aplikasi GUI sama dengan melakukan sesuatu dari baris perintah?
Jawaban yang Diterima:
Apakah aplikasi berbasis GUI ini juga menjalankan perintah yang sama di latar belakang?
Iya dan tidak. Mereka menulis ke dconf
database pengaturan, tetapi mereka dapat menggunakan cara yang berbeda untuk melakukannya. Program yang ditulis dengan Python kemungkinan akan menggunakan gi.repository.Gio
modul (saya tahu karena saya sering menggunakannya) atau mereka dapat menggunakan gsettings
sebagai perintah eksternal dengan memanggil subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
, dan pada dasarnya akan berjalan sebagai perintah shell. Program C akan menggunakan sesuatu yang serupa, kemungkinan gio.h
perpustakaan, atau bahkan bisa menggunakan exec()
keluarga fungsi untuk melakukan hal yang sama seperti Popen
lakukan dengan python. Jadi untuk menjawab pertanyaan judul Anda:"Apakah aplikasi berbasis GUI menjalankan perintah shell di latar belakang?" Mereka bisa, tetapi kemungkinan itu tidak perlu karena ada perpustakaan untuk bahasa apa pun yang digunakan aplikasi tersebut, dan kemungkinan akan sedikit lebih cepat untuk menggunakan fungsi perpustakaan, daripada memunculkan proses baru.
Untuk memberi Anda contoh bagaimana hal itu dilakukan dengan perpustakaan/modul, jangan ragu untuk melihat kode sumber indikator daftar peluncur saya. Di sana saya telah menulis sebuah fungsi untuk membuat sebuah instance dari Gio.Settings
class dan kemudian menggunakannya untuk memodifikasi peluncur Unity tergantung pada jenis daftar yang ingin Anda miliki di sana.
Bagaimana cara mengintip kerja internal aplikasi ini? Maksud saya, apakah ada cara untuk benar-benar melihat perintah yang dijalankan di setiap klik tombol?
Tidak. Jika Anda ingin melihat perintah mana yang dikeluarkan dalam bahasa pemrograman aplikasi itu saat Anda menekan tombol atau mengklik elemen jendela, maka itu tidak mungkin. Baca kode sumber aplikasi, jika memungkinkan untuk mendapatkannya. Anda dapat menggunakan dconf watch /
untuk melihat setelan apa yang diubah, tetapi bukan cara melakukannya.
Secara teknis, jika Anda mengetahui cara mengoperasikan debugger, membaca alamat memori, dan mengetahui beberapa bahasa rakitan, maka Anda dapat mengetahui apa yang dilakukan aplikasi pada tingkat CPU dan memori. Ini dikenal sebagai rekayasa balik perangkat lunak dan sering digunakan oleh profesional keamanan untuk menganalisis perangkat lunak berbahaya dan menemukan kerentanan dalam perangkat lunak yang sah.
Apakah aplikasi ini membuka terminal di latar belakang dan menjalankan perintah ini?
Tidak, tidak ada terminal yang terpasang. Banyak program tahu di mana dconf
database untuk pengguna berada dan menulis di sana. Ada juga bus komunikasi antar-proses yang dikenal sebagai dbus
, di mana program dapat mengirim sinyal, dan program akan seperti "Hei, itu pesan untuk saya!"
tambahan
-
Bisakah aplikasi menjalankan aplikasi lain? Ya, itu dilakukan melalui
fork()
standar danexecve()
panggilan sistem. Inti dari pembuatan proses di Linux dan sistem *nix lainnya sebagian besar didasarkan pada keduanya. Mekanisme shell untuk menjalankan perintah non-builtin banyak menggunakan itu secara khusus. Saat Anda berlari secara interaktif$ ls
shell akan membuat proses baru melalui
fork()
, proses itu akan menjalankanexecve()
yang akan memulails
. Karena bagaimanaexecve()
proses bercabang baru itu akan menjadils
.pipe()
panggilan sistem adalah apa yang akan membantu membaca kembali outputls
. Saya sangat menyarankan membaca jawaban saya untuk Apa perbedaan antara pipa dan pengalihan untuk memahami cara kerja mekanisme pipa – ini bukan hanya|
operator, tetapi sebenarnya syscall. -
Bisakah aplikasi menjalankan perintah shell? Tidak. Sintaks shell hanya dipahami oleh shell itu sendiri. Apa yang dapat Anda lakukan, bagaimanapun, adalah memulai shell dengan baris perintah
-c
beralih dan memberikan perintah yang sesuai. Ini sering digunakan untuk pintasan khusus yang diatur di GNOME atau lingkungan desktop lainnya, karena pintasan khusus beroperasi pada yang dapat dieksekusi dan tidak ada shell untuk memahami sintaksnya. Jadi sebagai contoh, Anda akan melakukanbash -c 'xdotool key Ctrl+Alt+T'
untuk secara tidak langsung menjalankanxdotool
perintah ataubash -c 'cd $HOME/Desktop; touch New_File'
untuk membuat file baru di desktop melalui pintasan. Ini adalah contoh yang sangat menarik karena Anda dapat menggunakan variabel shell, karena Anda menggunakan shell secara eksplisit.