Ksh93 komut yerine çatalları nasıl önler


12

verilmiş

cmd='fun(){ echo "$@";  }; fun $(fun $(fun hi))'

mermiler bunu gerçekleştirmek için 2 çatal yapmaya ihtiyaç duyar

strace-f(){ strace -f "$@" 2>&1; }; 
for sh in dash bash zsh ksh; do 
    printf "$sh\t" ; strace-f $sh -c "$cmd"  |grep -e clone -e fork -c;
done

hariç kshkahramanca bir kez çatallanmasını olmadan yapar:

dash    2
bash    2
zsh     2
ksh     0

Bunu nasıl yapıyor?


Düzenle:

Atılan bir boru ile nasıl aşağı iner:

cmd='fun(){ echo "$@"| echo "$@";  }; fun $(fun $(fun hi))'

Çıktı:

dash    11
bash    10
zsh     5
ksh     3 

Başarısız olsa da tüm boru hatları için bunu yönetmez. Bunu tüm boru hatları için mümkün kılmak, prosseable diğer kabuklara getirmek istiyorum.
PSkocik

3
Sadece akıl sağlığı kontrolü için kshyüklediniz mi? Kodunuzu çalıştırdığımda, 0
yüklemediğim

1
@EricRenouf Lol, evet biliyorum. Ve bir şeyler yapıyor. ;)
PSkocik

Yanıtlayanlar stackoverflow.com/questions/14686872 adresini okumak isteyebilir .
JdeBP

Yanıtlar:


13

Ksh93 çatalları önlemek için çok şey yapar. Nihai sonucun trusssadece bir write(2)çağrıyı çağırdığını gösterir , ilk vakanın nasıl ele alınacağını bilmiyor .

David'in makro.c'deki komutu taraması ve dahili olarak "echo" ile başa çıkabileceğini bilmesi olabilir.

Söyleyebileceğim, geçen yıl ayrıştırıcıyı ve "Bourne Kabuğu" nun yorumlayıcısını yeniden yazdım ve çoğunlukla çatal sayısını azalttım ve çatalların çoğunu vfork()aramalarla değiştirdim. Bu şu anda Bourne Shell'i ksh93'ten sonra en hızlı ikinci kabuk haline getiriyor. Testlerinizi de yapmak isteyebilirsiniz bosh.

BTW: ksh93 genel olarak çatallardan kaçınır. Önceki tüm global değişkenleri içeren bir yapı uygular ve bu, "global" değişken yapı işaretçisinin farklı örnekleriyle çağrıldığında kabuk kodunun yeniden girilmesini sağlar.

Bu yöntem, (cmd)alt kabuk olduğunda ksh93 tarafından kullanılır .

Bu yeniden yazmanın nedeni David'in dizüstü bilgisayarında Win-DOS kullanması ve yavaş Cygwin'i sevmemesidir, bu yüzden UWIN yazdı ve Win-DOS'ta doğrudan ksh93 kullanıyor. fork()Win-DOS'ta hiç olmadığı için yeni bir çözüm bulması gerekiyordu ...

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.