“Alt kabuk” ve “alt süreç” arasındaki kesin fark nedir?


16

Göre bu ve bu , bir alt kabuk parantez kullanılarak başlatılır (…).

( echo "Hello" )

Göre bu , bu ve bu komut a ile başlatıldığında, bir süreç çatallı&

echo "Hello" &

Posix belirtimi bu sayfadaki sözcüğüsubshell kullanır ancak tanımlamaz ve aynı sayfada "alt işlem" tanımlamaz .

Her ikisi de çekirdek fork()işlevini kullanıyor, değil mi?

O zaman, bazı çatallara "alt kabuk" ve diğer çatallara "alt işlem" demenin tam farkı nedir.


Değil net neden POSIX bağlantı veriyor gerekçesi: Baz Tanımları yerine Baz Tanımlar kendileri: 3.93 Çocuk Süreci "belirli bir işlem tarafından oluşturulan yeni bir süreç () (çatal tarafından, posix_spawn () veya ...)" ; 3.376 Alt kabuk "Ana veya geçerli kabuk yürütme ortamından farklı bir kabuk yürütme ortamı" . Yani, aynı türden şeyler değil. Aradığınız ayrım bu mu?
fra-san

@ fra-san A aşağıdakilerden child processfarklı bir ortama sahip olabilir main: Gibi ( LANG=C eval 'echo "$LANG"' ). Bu çocuk süreç (parantez içinde) ayrıca bir alt kabuk (farklı ortam) mı?
Isaac

Ifade ( )olan tanım gereği kendi yürütme ortamı ile bir alt kabuk. Demek istediğim, bir alt kabuğun bir alt süreç olarak uygulanması gerekmiyor (Stéphane'nin ksh93 örneğiyle verdiği yanıtta belirttiği gibi). Görünüşe altkabuk ve çocuk süreç olmamaya sahip hem bir sonucu fork()çağrısı; bu nedenle, iki çeşit çatal arasındaki farkı aramak benim için doğru bakış açısı gibi görünmüyor. Bu yüzden sorunuzu daha iyi anlamaya çalışıyordum.
fra-san

İşte şimdi bunu görebiliyorum tldp aslında bağlantılı sayfa bir alt kabuk söylüyor olan bir çocuk süreç. Bence bu tanım muhtemelen yanıltıcı bir basitleştirmedir.
fra-san

Yanıtlar:


16

POSIX terminolojisinde, bir alt kabuk ortamı Kabuk Yürütme Ortamı kavramına bağlıdır .

Alt kabuk ortamı, üst ortamın kopyası olarak oluşturulan ayrı bir kabuk yürütme ortamıdır. Bu yürütme ortamı açık dosyalar, umask, çalışma dizini, kabuk değişkenleri / fonksiyonlar / takma adlar gibi şeyleri içerir ...

Bu alt kabuk ortamındaki değişiklikler üst ortamı etkilemez.

Geleneksel olarak, POSIX belirtiminin dayandığı Bourne kabuğunda veya ksh88'de, bu bir alt işlem çatallanarak yapılır.

POSIX'in bir alt kabuk ortamında komutun çalışmasını gerektirdiği veya izin verdiği alanlar, geleneksel olarak ksh88'in bir alt kabuk işlemini çatalladığı alanlardır.

Ancak, uygulamaları bunun için bir alt süreç kullanmaya zorlamaz.

Kabuk bunun yerine bu ayrı yürütme ortamını istedikleri gibi uygulamayı seçebilir.

Örneğin, ksh93 bunu üst yürütme ortamının niteliklerini kaydederek ve çatalın önlenebileceği bağlamlarda alt kabuk ortamının sonlandırılması üzerine geri yükleyerek yapar (çatallanma çoğu sistemde oldukça pahalı olduğu için bir optimizasyon olarak).

Örneğin:

cd /foo; pwd
(cd /bar; pwd)
pwd

POSIX, cd /fooayrı bir ortamda çalışmasını ve bunun gibi bir çıktı almasını gerektirir :

/foo
/bar
/foo

Ayrı bir işlemde çalıştırılmasını gerektirmez. Örneğin, stdout kırık bir boru haline gelirse pwd, alt kabuk ortamında çalıştırmak SIGPIPE'in tek kabuk işlemine gönderilmesini sağlayabilir.

Dahil olan çoğu kabuk , bir alt süreçte (üst süreç sonlandırılmasını beklerken) bashiçindeki kodu değerlendirerek uygular (...), ancak ksh93 bunun yerine kodu (...)aynı işlemde çalıştırdıktan sonra :

  • bir alt kabuk ortamında olduğunu unutmayın.
  • daha sonra cd, önceki çalışma dizinini (genellikle O_CLOEXEC ile açılan bir dosya tanımlayıcısında) kaydedin, OLDPWD, PWD değişkenlerinin değerini ve cddeğiştirebilecek her şeyi kaydedin ve sonrachdir("/bar")
  • alt kabuktan döndükten sonra, geçerli çalışma dizini geri yüklenir ( fchdir()kaydedilen fd'de bir ile) ve alt kabuğun değiştirmiş olabileceği diğer her şey geri yüklenir .

Bir çocuk sürecinden kaçınamayacağınız bağlamlar vardır. ksh93 çatallanmıyor:

  • var=$(subshell)
  • (subshell)

Ama içeri giriyor

  • { subshell; } &
  • { subshell; } | other command

Yani, şeylerin aynı anda çalışabilmeleri için ayrı süreçlerde çalışması gerektiği durumlar.

ksh93 optimizasyonları bundan daha ileri gider. Örneğin,

var=$(pwd)

kabukların çoğu bir işlemi çatallatır, çocuğa pwdkomutu bir boruya yönlendirilmiş stdout'u çalıştırmasını sağlar, pwdgeçerli çalışma dizinini o boruya yazar ve üst işlem borunun diğer ucundaki sonucu okur, ksh93bunların hiçbirini sanallaştırmaz ne çatal ne de boru gerektirir. Çatal ve boru yalnızca yerleşik olmayan komutlar için kullanılır.

Alt kabukların, alt işlemi çatallayan başka bağlamlar olduğuna dikkat edin. Örneğin, ayrı bir yürütülebilir dosyada (ve aynı kabuk yorumlayıcısı için tasarlanan bir komut dosyası değil) depolanan bir komutu çalıştırmak için, bir kabuğun bu komutu çalıştırmak için işlemden geçirmesi gerekir, aksi takdirde bu komut döndükten sonra daha fazla komut çalıştırabilir.

İçinde:

/bin/echo "$((n += 1))"

Bu bir alt kabuk değil, komut geçerli kabuk yürütme ortamında değerlendirilecek, geçerli kabuk yürütme ortamının ndeğişkeni artırılacak, ancak kabuk, bu /bin/echokomutu $((n += 1))bağımsız değişken olarak genişletilerek yürütmek için bir alt işlemi kesecek .

Birçok kabuk, bir komut dosyasının veya alt kabuğun son komutu ise (alt süreçler olarak uygulanan alt kabuklar için) bu dış komutu çalıştırmak için bir alt işlemi çatallamadıklarından bir optimizasyon uygular. ( bashancak bu komut alt kabuğun tek komutuysa yapar).

Bunun anlamı, bu kabuklarda, alt kabuktaki son komut harici bir komutsa, alt kabuk ek bir işlemin ortaya çıkmasına neden olmaz. Karşılaştırırsanız:

a=1; /bin/echo "$a"; a=2; /bin/echo "$a"

ile

a=1; /bin/echo "$a"; (a=2; /bin/echo "$a")

aynı sayıda işlem oluşturulur, ancak ikinci durumda, ikinci çatal daha önce yapılır, böylece a=2alt kabuk ortamında çalıştırılır.


1

altkabuk

Çocuk kabuğuna alt kabuk da denir. Alt kabuk, ana kabuktan ve başka bir kabuktan oluşturulabilir. Alt kabuk aşağıdakiler kullanılarak oluşturulabilir:

1. İşlem Listesi

İşlem listesi parantez içindeki komut gruplamasıdır. Misal:

( pwd ; (echo $BASH_SUBSHELL)) 

Bu, geçerli çalışma dizinini ve ortaya çıkan kabuk sayısını yazdırır. NOT Alt kabuğun açılması pahalıdır.

2. İşbirliği

Arka plan modunda bir alt kabuk oluşturur ve bu alt kabuk içinde bir komut yürütür.

coproc sleep 10

jobsKomut yazarsanız

[1]+  Running                 coproc COPROC sleep 10 &

uykuyu arka planda çalışan arka plan işlemi olarak göreceksiniz.

Çocuk Sürecini Çatallama

Hesaplamadaki alt süreç, başka bir işlem tarafından oluşturulan bir işlemdir. Harici bir komut yürütüldüğünde bir alt işlem oluşturulur. Bu eyleme çatallama denir.

$ps -f
UID        PID  PPID  C STIME TTY          TIME CMD  
umcr7     3647  3638  0 13:54 pts/0    00:00:00 bash
umcr7     3749  3647  0 13:59 pts/0    00:00:00 ps -f

As ps -fdış komut (bazen dosya sistemi komutu denilen yani harici komut, dışarıda bash kabuk var olan bir programdır.) 'Dir bu da yürütüldüğü bash kabuğunun üst kimliği ile alt süreç oluşturmak olacaktır.


-1

Her ikisi de (alt kabuk ve alt kabuk) ana kabuktan ayrı bir süreçtir (her ikisi de ana kabuğun alt öğeleridir). Yani, farklı PID'leri var. Ve her ikisi de ana kabuğun çatalıyla (kopya) başlar.

Alt kabuk, değişkenlerin, işlevlerin, bayrakların ve her şeyin üst kabukta olduğu gibi kullanılabildiği üst kabuğun bir kopyasıdır. Bu tür değerlerde yapılan değişiklikler üst öğeyi etkilemez.

Bir alt kabuk çatal olarak başlar, ancak başlangıç ​​yapılandırmaları tarafından verilen kabuk varsayılan değerlerine sıfırlanır. Bazı kodları yürütmek için kullanılan bir işlem haline gelir (kabuk veya komut).

Alt kabuk değişken değerlere erişebilir:

$ x=123; ( echo "$x")
123

Bir alt kabuk yapılamadı (dışa aktarılmayan değişkenler):

$ x=234; sh -c 'echo "x=$x"'
x=
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.