Ubah proses induk dari suatu proses?

14

Apakah mungkin untuk mengubah proses induk dari suatu proses? Jika ya, bagaimana?

Sebagai contoh,

  • bagaimana cara screenmelampirkan screensesi 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 disownpada suatu proses mengubah proses induk dari proses, hanya karena namanya disownmenyiratkan itu. Tetapi saya menemukan itu tidak benar.

  • Klien Emacs dapat melampirkan ke server emacs pada tab terminal yang berbeda. Apakah ada perubahan proses induk?

Tim
sumber
disownhanya 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.
Warren Young
Apakah proses mengingat induknya?
Tim
Jika ingin tahu, ia memanggil 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.
Warren Young
Kedengarannya seperti fitur kernel baru yang menarik.
ChuckCottrill

Jawaban:

14

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 memulai screen, 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 sebagai SCREEN, 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 screenberakhir, daemon SCREENmasih 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 baru screen, maka daemon akan terus berlipat ganda seperti sebelumnya. Daemon akan berjalan terus berjalan sampai semua subproses berakhir, terbunuh, bug fatal ditemui atau host reboot.

Arcege
sumber
Terima kasih. Saya menambahkan "Klien Emacs dapat melampirkan ke server emacs pada tab terminal yang berbeda. Apakah ada perubahan proses induk?"
Tim
1
Setiap proses hanya memiliki satu orang tua, sampai orang tua meninggal atau mati. Jika mati, intinya adalah bisa diperdebatkan. Jika orang tua meninggal, maka PPID menjadi 1, initproses. Ini adalah satu-satunya waktu proses induk akan berubah - ketika proses induk berakhir. Menghubungkan melalui komunikasi antarproses (pipa, soket, dll.) Tidak memengaruhi PPID.
Arcege
Bagaimana cara Emacs melampirkan klien ke server di tab terminal yang berbeda?
Tim
Server akan mendengarkan pada soket (biasanya file soket domain UNIX) menunggu koneksi. Klien akan membuka koneksi pada soket itu. Tab tidak relevan dengan komunikasi antara klien dan server, bisa saja tab berbeda, emulasi teminal berbeda (xterm vs rxvt vs terminal), atau bisa juga xemacs. Setiap klien tahu di mana harus terhubung, sehingga bisa dari mana saja.
Arcege
-2

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 !!!

pengguna239712
sumber