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ı?
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:
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 " init
sü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, init
işlem kurtarmaya başlar. yetim onları işler ve evlat edinir. Bu, bir çocuğun ebeveynini kaybettikten sonra, init
süreç yeni ebeveyn süreci olur. ”
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_SUBREAPER
seç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_ACQUIRE
ve PROC_REAP_RELEASE
seç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.
procctl()
. DragonFly BSD Manuel sayfalar. § 2.exit
Tek 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)
.
Ben buna inanmıyorum. Her zaman init sürecine gider.