Apakah mungkin untuk mengubah proses induk dari suatu proses? Jika ya, bagaimana?
Sebagai contoh,
bagaimana cara
screen
melampirkanscreen
sesi dan proses yang berjalan di dalamnya untuk proses shell yang berbeda? Apakah ada perubahan proses induk?Saya sepertinya mendengar cara-cara lain untuk mengubah proses shell di mana sebuah program berjalan, tetapi saya tidak ingat. Apakah ada perubahan proses induk program?
Saya pikir
disown
pada suatu proses mengubah proses induk dari proses, hanya karena namanyadisown
menyiratkan itu. Tetapi saya menemukan itu tidak benar.Klien Emacs dapat melampirkan ke server emacs pada tab terminal yang berbeda. Apakah ada perubahan proses induk?
disown
hanya menghapus anak yang diberikan dari daftar internal proses anak shell. PPID anak tetap milik shell. Shell lupa bahwa itu pernah memulai anak itu, tetapi kernel ingat.getppid(2)
, panggilan sistem, dan panggilan sistem ditangani oleh kernel. Suatu program dapat dikacaukan dengan mengeluarkan panggilan itu, menyimpan nilai, dan kemudian menggunakan nilai itu setelah asal usulnya telah berubah. Ada kemungkinan kondisi balapan di sini.Jawaban:
Id proses induk (ppid) dari suatu proses tidak dapat diubah di luar kernel; tidak ada panggilan sistem setppid. Kernel hanya akan mengubah ppid ke (pid) 1 setelah proses induk dihentikan - jika proses tidak menanggapi sinyal bahwa induk dihentikan. Agar hal ini terjadi, kebutuhan proses untuk mengabaikan berbagai sinyal (
SIGHUP
,SIGTERM
, dll) terlebih dahulu.screen(1)
memiliki cara yang sangat elegan dalam menangani pelepasan dan pemasangan kembali. Saat pertama kali memulaiscreen
, Anda sebenarnya memulai antarmuka pengguna (ui), yang secara default akan membuat daemon (pengelola sesi). Daemon ini tidak memiliki terminal yang terkait dengannya, grup proses baru (setpgrp(2)
), id sesi baru (setsid(2)
). Daemon, berjalan sebagaiSCREEN
, kemudian akan membuat subproses yang terhubung ke pseudo-terminal (pty
), kemudian multiplexing data dari ptys dan ui (screen
). Subproses berpikir mereka berbicara dengan terminal nyata.Jika ui
screen
berakhir, daemonSCREEN
masih akan berjalan, buffering data, menangani sinyal, menunggu ui baru, dll. Karena ini adalah grup proses yang berbeda dan dalam sesi sendiri. Ketika Anda memasang kembali dengan ui baruscreen
, maka daemon akan terus berlipat ganda seperti sebelumnya. Daemon akan berjalan terus berjalan sampai semua subproses berakhir, terbunuh, bug fatal ditemui atau host reboot.sumber
init
proses. Ini adalah satu-satunya waktu proses induk akan berubah - ketika proses induk berakhir. Menghubungkan melalui komunikasi antarproses (pipa, soket, dll.) Tidak memengaruhi PPID.Saya mengerti. Anda perlu mengubah kernel untuk menulis beberapa modul untuk melakukannya! Saya pikir ini akan berguna dalam beberapa kasus. Misalnya Anda melakukan kerja keras yang lama, mereka menghabiskan banyak sumber daya selama satu jam ... Dan ketika sistem tidak merespons (seperti biasa dalam kasus ini), Anda melakukan beberapa tindakan yang tidak dapat diprediksi (karena Anda perlu melakukannya dan Anda tidak yakin mengklik) mouse di tempat yang benar sehingga sistem tidak merespon untuk waktu yang lama) dan membunuh proses induk secara tidak sengaja. Sistem biasanya membunuh semua anak! Tetapi jika proses anak adalah root dan orang tua hanya pengguna ordinal dan tindakan membuat pengguna ordinal juga proses ini tidak terbunuh dalam hal apapun! Dan orang tuanya akan init dengan PID 1. Dan setelah sistem pada akhirnya merespons Anda ingin mengembalikan hierarki. Tapi kamu tidak bisa !!! Standar Anda memulai upgrade sistem sebagai root dari terminal sebagai pengguna biasa dengan su. Mengapa? Jadi untuk mendapatkan semua kesalahan dan peringatan di konsol. Utilitas untuk meningkatkan adalah GUI. Mereka mendapatkan info ini untuk apa-apa ... Saya ingat di windows OS ini bisa dilakukan. Ada fungsi WinAPI khusus. Mengapa di Linux ini tidak bisa dilakukan? Tidak jelas ... Sederhana saja !!!
sumber