Fork () ve exec () ne zaman çağrılır?


9

Fork () ve exec () komutlarını öğreniyorum. Genellikle fork () ve exec () birlikte çağrılır. (fork () yeni bir alt işlem oluşturur ve exec (), geçerli işlem görüntüsünü yenisiyle değiştirir.) Ancak, hangi işlevlerde her işlevi kendi başına çağırabilirsiniz? Bunun gibi senaryolar var mı?


2
Geleneksel çatal bomba: (1) çatal (); sistem kaynaklarını tutmak.
Joshua

Yanıtlar:


22

Elbette! "Paketleyici" programlarında yaygın olan bir örüntü, çeşitli şeyler yapmak ve daha sonra kendisini sadece bir execçağrı ile (çatalsız) başka bir programla değiştirmektir.

#!/bin/sh
export BLAH_API_KEY=blub
...
exec /the/thus/wrapped/program "$@"

Bunun bir gerçek yaşam örneği GIT_SSH(gerçi git(1)de teklif yok GIT_SSH_COMMANDYukarıdaki sarıcı programı yöntemini yapmak istemiyorsanız).

Sadece httpdçatal , genellikle bir grup işçi işleminin ortaya çıkmasında kullanılır (örneğin çatal modunda Apache (yalnızca çatal daha iyi, CPU'yu yakması gereken işlemlere uyar, ancak ağ G / Ç'nin gerçekleşmesini bekleyen başparmaklarını bükenlere değil) ) veya OpenBSD'deki ve diğer programlar tarafından kullanılan ayrıcalık ayırma için sshd(exec yok)

$ doas pkg_add pstree
...
$ pstree | grep sshd
 |-+= 70995 root /usr/sbin/sshd
 | \-+= 28571 root sshd: jhqdoe [priv] (sshd)
 |   \-+- 14625 jhqdoe sshd: jhqdoe@ttyp6 (sshd)

rootSshd istemci üzerinde kendisinin bir kopyasını (28571) ve daha sonra ayrıcalık ayrılması için bir başka kopyası (14625) çatallanabilen connect gelmiştir.


14

Çok var.

fork()Olmadan çağıran programlar exec()genellikle ana süreçte farklı işlemler yapmak için çocuk işçi süreçleri yumurtlama modelini takip eder . Sen gibi çeşitli programlarda bu bulacaksınız dhclient, php-fpmve urxvtd.

exec()Olmadan çağıran bir program fork(), zincir yüklemesi ve sürecini farklı bir program görüntüsü ile kaplamasıdır. Durumu işlemek için belirli şeyler yapan ve daha sonra bu revize edilmiş işlem durumuyla çalıştırmak için başka bir program yürüten zincir yükleme yardımcı programlarının bir alt kültürü vardır. Bu tür yardımcı programlar, daemontools hizmet ailesi ve sistem yönetimi araç kümelerinde yaygındır , ancak bunlarla sınırlı değildir. Birkaç örnek:

Daemontools aile toolsets sahip bir çok dışında, bu tür araçların machineenvaracılığıyla find-matching-jvmetmek runtool.


2

Diğer cevaplara ek olarak, hata ayıklayıcılar, ve ptracearasındaki boşluğu tipik olarak kullanırlar . Bir hata ayıklayıcı, ana işlemi olan hata ayıklayıcı tarafından izlendiğini belirtmek için kendisini işaretlemelidir . Bu hata ayıklayıcı için gerekli izinleri vermektir.forkexecPTRACE_TRACEME

Böylece bir hata ayıklayıcı önce kendini çatalıyordu. Çocuk çağırır ptraceile PTRACE_TRACEMEve daha sonra çağrı exec. Hangi alt program yürütülürse uygulansın şimdi ebeveyn tarafından izlenebilir.


Çatal ve exec arasında bir şeyler yapmanın birçok örneği vardır, en yaygın olanı G / Ç'yi yönlendirir (örneğin boruların ayarlanması). Ancak soru, herhangi bir yönetici olmadan çatal yapmakla ilgilidir.
Barmar

0

çatalsız exec

Böyle bir şey yapmak istemenizin en az iki nedeni vardır:

  1. Zincir yükleme. Geçerli işlem görüntüsünün yerini farklı bir şey alır.
  2. Çalışmakta olan programı yeniden başlatmak (örneğin SIGHUP veya böyle bir sunucu işlemini gerçekleştirdiğinizde, her şeyi yeniden yükleyip tamamen yeni bir başlangıç ​​yaptığınızda olabilir). Bir şekilde, bunun zincir yükleme olduğunu, ancak aynı programla çakıştığını iddia edebiliriz.

exec olmadan çatal

Her daemon her başladığında bunu yapar (aslında iki kez). Bu birkaç şey yapar, aralarında kabuk asılmaz (kabuğun beklediği orijinal işlem sona erdiğinden) ve arka plan programı artık terminal tarafından kontrol edilmez, bu nedenle kabuk penceresinin kapatılması arka plan programını öldürmez.

Başka bir yaygın kullanım, 25 yıl önce apache web sunucusu tarafından ünlü hale getirilen işçi çocuklarını çatallamaktır (günümüzde, gürleyen sürü problemine çok eğilimli olduğu için bu son teknoloji olarak kabul edilmemektedir, ancak darn basit, mümkün olan en sağlam sunucu).

Yine bir başka yaygın kullanım tutarlı bir anlık görüntü oluşturmaktır. forksadece bir süreç oluşturmakla kalmaz, aynı zamanda adres alanını kopyalar (teorik olarak gerçekte sadece yazma üzerine kopyaları işaretler). Bu (atomik olarak), üst öğenin artık değiştiremeyeceği tüm program verilerinin anlık görüntüsünü oluşturur.
Bazı programlar bundan yararlanır. Örneğin redis, veriyi aynı anda değiştirirken verileri diske (tutarlı bir durumda) kaydeder . Bu yalnızca forküst işlem tarafından yapılan değişiklikleri görmeyen tutarlı bir anlık görüntü oluşturduğu için çalışır .


Bugünlerde çok az dæmons var, çoğu bunu standart olarak yapmıyor ya da yaygın olarak kullanılan bir moda sahip değil. Bu çatala bir hatadır giden hazırlık uyumsuzluğu ve dehşet ve hatalarından biridir dæmonization yanıltmacaya . Bu hata uzun süredir yaygın olarak gözden düştü.
JdeBP
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.