Ana işlem öldüğünde yeni ana işlem


22

UNIX'te, bir ana işlem ortadan kaybolduğunda, tüm alt işlemlerin başlangıç ​​olarak ana öğelerini sıfırladığını düşündüm. Bu her zaman doğru değil mi? İstisna var mı?

Yanıtlar:


5

Yorumumu bir cevaba taşıma… İstisnalar olduğuna inanmıyorum.

Bunu "bazen ana süreç çocuğu öldürülmeden önce öldürülür. Bu durumda," tüm işlemlerin ebeveyni " initsüreci yeni PPID (ana işlem kimliği) olur. Bazen bu işlemlere yetim işlemi denir. kaynak

Benzer şekilde IBM’in blogunda da açıklanmaktadır : “Ebeveyn çocuktan önce ölür veya ölür. Yukarıdaki senaryoda, çocuk işlemi yetim olur (ebevesini kaybettiği için). Linux’ta, initişlem kurtarmaya başlar. yetim onları işler ve evlat edinir. Bu, bir çocuğun ebeveynini kaybettikten sonra, initsüreç yeni ebeveyn süreci olur. ”


61

2014 yılında yazılan üç cevap, hepsi Unices ve Linux'ta, sürecin istisnasız olarak # 1 numaralı süreçle tekrar tanıştığını söylüyor. Üç yanlış cevap. ☺

Gibi SUS , diğer cevaplar birinde alıntı diyor burada bu yüzden yine yetim çocukların ebeveyn süreci olarak ayarlanır teklif olmaz uygulama tanımlı süreç. Cristian Ciupitu, uygulamanın ne tanımladığını görmek için Linux belgelerine başvurma hakkına sahiptir. Ancak tutarsız ve güncel olmayan belgelerle yanıltılıyor.

Bu üç cevap yazılmadan iki yıl önce ve bu cevabı ilk yazarken hızlı bir şekilde üç yıl önce gelen Linux çekirdeği değişti. Sistem geliştiricileri, işlemlerin kendilerini "alt okuyucular" olarak ayarlama yeteneklerini eklediler. Linux 3.4'den itibaren, işlemler prctl()sistem çağrısı PR_SET_CHILD_SUBREAPERseçeneğini bu seçenekle yapabilir ve sonuç olarak 1 numaralı işlem değil, artık sahip oldukları soysal işlemlerin herhangi birinin ebeveyni olur. İçin man sayfasıprctl() güncel, ancak diğer man sayfaları güncellendi ve tutarlı hale getirilmedi.

Sürüm 10.2'de FreeBSD, mevcut procctl()sistem çağrısını PROC_REAP_ACQUIREve PROC_REAP_RELEASEseçeneklerini genişleterek aynı yeteneği kazandı . DragonFly BSD'den bu mekanizmayı benimsemiştir; hangi 4.2 sürümünde kazanılan, başlangıçta adlandırılmış reapctl()ancak geliştirme sırasında yeniden adlandırılmış procctl().

Bu yüzden istisnalar ve oldukça belirgin olanlar var: Linux, FreeBSD / PC-BSD ve DragonFly BSD'de, yetim çocukların ana süreci, alt okur olarak işaretlenen çocuğun en yakın atası sürecine, ya da işlem # 1'e ayarlandı. atalarının alt işlemi yoksa. Çeşitli daemon denetleme programları - systemd (geliştiricileri bunu ilk olarak Linux çekirdeğine yerleştiren kişi dahil), başlangıç ​​ve son nokta dahil service-manager- zaten bunu kullanıyor.

Böyle bir cin amiri 1. işlemek değildir ve bu tür bir interaktif oturumda gibi bir hizmeti olarak çoğaltılır ve varsa o birinci oturumu yapar içinde çift tarafından "Artalanda" teşebbüs (oldukça inatçı) trick fork()ing , ardından kişinin süreci olacak sonuç # 1 sürecinin değil, daemon amirinin çocuğu olarak. Oturum açma oturumlarından doğrudan servet yumurtlayabilmeyi beklemek elbette temel bir hatadır. Ama bu başka bir cevap.

daha fazla okuma


Aslında bir oturum başlatma işlemine (Upstart ile Ubuntu'da) bağlanan yetim süreçleri fark ettim, ancak önemini asla anlamadım. +1
muru

Özellikle başlangıç ​​oturum başlangıçlarında daha fazla bilgi için unix.stackexchange.com/a/194208/5132 adresine bakın .
JdeBP

8

exitTek UNIX® Spesifikasyonu, Versiyon 2'deki kılavuz sayfasına göre :

Çağıran sürecin tüm alt süreçleri ve zombi süreçlerinin ana işlem kimliği, uygulamaya bağlı bir sistem işleminin işlem kimliğine ayarlanmıştır. Yani, bu süreçler özel bir sistem süreci tarafından miras alınır.

Çoğu Unix varyantı için, bu özel işlem init(PID 1).

Linux wait(2)adam sayfası bunu onaylar:

Bir ebeveyn süreci sonlandırırsa, "zombi" çocukları (eğer varsa), zombileri çıkarmak için otomatik olarak bir bekleme yapan init (8) tarafından kabul edilir.

FreeBSD wait(2), NetBSD wait(2), OpenBSD wait(2)ve Mac OS X wait(2)kılavuz sayfaları da bunu doğrular:

Bir üst işlem, tüm alt işlemlerinin sona ermesini beklemeden sona ererse, kalan alt işlemlere ana işlem 1 kimliği (init işlem kimliği) atanır.

Oracle Solaris 11.1 wait(3C)kılavuz sayfası da bunu doğrular:

Bir üst süreç, alt süreçlerinin sona ermesini beklemeden sona ererse, her alt sürecin üst işlem kimliği, başlangıç ​​işlemlerini çocuk işlemlerini miras alarak 1'e ayarlar; bkz Intro(2).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.