C'de özel bir kabuk inşa etmek, işletim sistemlerinin, süreç yönetimi ve sistem programlamasını derinleştirmek için mükemmel bir yoldur.Bir kabuk sadece bir komut tercümanından daha fazlasıdır; kullanıcı ve çekirdek arasındaki birincil arayüz, iş kontrolü, borulama, senaryolama ve çevre yönetimi gibi özellikleri geliştirmektir.

Bir Shellin Temellerini Anlayın

Onun özünde, bir kabuk basit bir döngü gerçekleştirir: bir giriş çizgisi okuyun, herhangi bir interaktif kabukun kalbine bakın ve sonra tekrarlamanız gerekir. ancak gerçek bir kabuk birçok kenar davalarını ele almak ve tutarlı bir kullanıcı deneyimi sağlamak. temel döngü -üstelik komutları ve dış programları arasında ayrım yapmak.

Sütun iki birincil modda çalışır: [[Dönetici[Dönetici:0) ve [[Dönetici[Dönetici:2) Etkileşimli olarak, bir akıştan okuma (örneğin,) baskılar, bir çıkış kodlarının dikkatli bir şekilde işlenmesi ve kaynak temizlemesini gerektirir.

Bourne kabukları gibi tarihi bir kabuk anlayışı, Bash ve Zsh, uygulamamız gereken özellikler için bağlam sağlar. Modern kabuklar tasarım seçimlerinin on yıllarını miras alır - borular, süreç grupları, iş kontrol sinyalleri - bu, POSIX'ta standarttır.Bu standartlarda pratik bir anlayış kazanır ve arkalarında ticaret-offlar.

Özel bir Shell'in Temelleri

Her kabuk, ne kadar basit olursa olsun, bu temel hizmetler sağlamalıdır:

  • [FONT:0)Input Parsing:[Dönetici:[Dönetici:0)) Bir komut yapısına ham giriş (komün adı, argümanlar, operatörler).
  • [FONT:0]Command Execution:[Dönetici:2) Sistem aramalarını kullanarak, [[Dönetici:0) ve [[Dönetici programları başlatmak için 4 ).
  • [FONT:0)İş Kontrolü: [Dön ve arka plan süreçleri, süreç grupları ve sinyal işlemeleri.
  • [FONT:0)Piping ve Reyy:[Dönlendirme:[Dönlendirme ve Yeniden Kontrol:[Dönlendirme: 1) Bir sürecin çıktısını başka bir şeye yönlendirerek akışları dosyalara yönlendirerek yönlendirin.
  • [FONT:0]Senaryo Destek:[Dönetici:[Dönetici:0)[[FONTD)[[[FONTD:0)))[[[[FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=TRNT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=TRNT=FONT=
  • [FONT:0) Built-in Komutları: [FONTD: 5) [FONTD: 7)) [FONTDÜSÜŞÜN, SİAD, SİAD, SİAD, SİAD, SİAD, SİAD, SİAD, SİAD, SİAD, SİAD, SİAD, SİAD, SİAD, ÂNİNŞİ, ÂHİRİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂHİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİNŞİ ÂNİN
  • [FONT:0)Environment Management:[Dönetici:[Dönetici:0)[Dönetici Yönetimi:[Dönetici:[Dönlendirme ve çevre değişkenlerini değiştir]

Bu bileşenlerin her biri diğerleriyle etkileşime girer. Örneğin, iş kontrolü, iş makinelerine de nasıl çalıştığını etkileyen süreç gruplarına dayanır. parsing, execution ve iş yönetimi arasındaki modüler tasarım inşa etmek sizi daha sonra birçok baş ağrısı kurtaracaktır.

Giriş Parsing: Raw Line'dan Komutanlığa

Lexical Analysis

Parsing giriş çizgisini Jetonlara bölmeye başlar. A token, mantıksal bir birim oluşturan karakterler dizisidir: bir komut, bir argüman, bir operatör () ve [[Dönetici: 16|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

Daha sağlam bir yaklaşım, ⁇ 'nin bir alıntının içinde olup olmadığını takip etmek için bir devlet makinesi kullanır, kaçış bir dizi veya normal metin.Bu, yanlış elleme alanlarının içinde yanlış bir şekilde kullanılması gibi ortak böceklerden kaçınır.

Komutan Yapı

Basit bir komut temsil etmek için bir struct tanımlayın:

struct simple_cmd {
 char **args; // command name + arguments, NULL-terminated
 int argc; // number of arguments
 char **redirect_in; // input redirection file (if any)
 char **redirect_out; // output redirection file (if any)
 int append; // 1 if >>, 0 if >
 int background; // 1 if & is present
};

Bir boru hattı daha sonra bu basit komutların bir listesidir, her biri kendi yönlendirmeleriyle. ⁇ ayrıca basit komut hatlarıyla ilgili olarak yeterli sayıda komut hattını temsil eder ve yarı-kolonları da üretim için yapar.

Komutan: Fork, Exec ve Yol

Fork-Exec Deseni

Dış bir program uygulamak için, ilk çağrılar bir çocuk süreci oluşturmak için. çocuk daha sonra www.D.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.

Bir nuance, program bulunamadı veya idam edilemezse başarısız oluyor.Görüntü kaza yapmadan hataları da bildirmelidir. Ayrıca, kabuk sinyal elleri ve işlem gruplarına daha önce ve iş kontrolüne müdahale etmekten kaçınmalı.

İnşa Edilmiş Komutlar

Yapım aşamasında doğrudan çalıştırılmalıdır. - Evlattan önce ve önceden yapılan bir belgeyi kontrol etmek için.Eğer şu anda C işleviyle ve bu nedenle bir çocuk sürecinde idam edilemez.Sorunlar doğrudan kabuk sürecinde çalıştırılmalıdır: inşa edilmesi gereken en kolay yol, inşa edilmesi gereken komut adını kontrol etmektir.

  • [FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=I=FONT=I=I=I=I=FONT=I=I=FONT=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I=I)
  • [FONT: 9/01/2009]
  • [FONT: 27/44|Döncüm|
  • [FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=)
  • [FONT: 29) - liste arka plan işleri
  • [FONT: 30) / [[FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT=FONT
  • [FONT=FONT][/FONT=FONT=FONT=FONT=FONT=)

Çevre Değişkenleri

Sütun ebeveynin çevresini devralır ve komuta tartışmalarında değişken alt kuruma geçmelidir (örneğin, uygulamadan önce jetonları otomatik olarak kullanır).Bu, her token for the value in environment.

Path Çözümü

Komutan inşa edilmiş değilse, kabuk, komutun tam bir yol olduğu durumunda, (uzayda veya akıp giden) bu otomatik olarak, komut bir çeki içermiyorsa, kendi yol kararınızı yerine getirmek isteyebilir.

Piping ve Reyyy

Tek bir Pipet uygulamak

Borular, bir sürecin standart girişine bir işlemden diğerine bağlanır. Sistem çağrıyı alışkanlık tanımlayıcıları kullanarak yapar: [[DörtÜye ait olan yazı için [[Şerefli:Şerefliye|steye/kırıklık|sağanlık-ı Hakka ait olan) iki çocuğun iki çocuğu, aksi takdirde, yazılı olarak, doğru yazılmasından sonra borunun kapatılması gerekir.

Dosya tanımlayıcı yönetimine dikkat edin: her çocukta kullanılmamış sonu kapatmanız ve tüm çocukları yakalamaktan sonra ebeveyndeki tüm boruları kapatmanız gerekir. Aksi takdirde, süreçler asla gelen giriş için asılabilir.

Birden çok Pipes

Daha uzun boru hatları için, birden fazla boruya ihtiyacınız var. Yaygın bir yaklaşım her orta aşama için bir boru oluşturmak.İlk boru için çocuk süreci; dördüşükT:52; ve sonraki boruyu kullanarak yönlendirmelerini kurmak; ve bunu son borudan okumak zorundasınız.

I/O Yeniden

Yeniden yönlendirme operatörleri ([DörtÜDÜDÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜye Olmayanlar: BÜYÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜN

Ayrıca stderr yönlendirmesini ([[[[Dönem: 65) ve bir yönlendirme ([Dön:66) desteklemelisiniz. Bu, dosya tanımlayıcı numarasını ve hedef dosya adını tanımlamak için token'i gerektirir.

İş Kontrolü

Süreç Grupları

İş kontrolü, süreç grupları kavramı etrafında inşa edilmiştir. Her bir boru hattı (iş) kendi sürecine ait olup, grup ID'si işdeki ilk sürecin ID'sine eşit olarak yerleştirilir.TheİLFLT:67) veya [[D:68 sistem çağrısı her çocuğun sürecine hemen sonra girer.

Terminalin foreground süreci grubu, tam olarak tamamlanmış olan (veya askıya alındıktan sonra) CtrlFLT:69.Bir iş yerinde çalışırsa, kabuk bu iş için terminale teslim edilmelidir.

Signals

Sütun, son derece son derece çocuk süreçleri için sinyal eller yüklemesi gerekir.Eller, [[Döneticiler:74|67|Dinler için tüm çocukları toplamak için bir döngü içinde.Bu, zombi işlemleri ve iş listesini güncellemek için.

Etkileşimli kabuklar için, [[BİLMİN:75|BİBİ-Öylegeden) mevcut foreground işinin sona ermesine neden olmalıdır, kabuğun kendisi değil.You canETHT:76|tamamlama işleminde görmezden gelin ve bir iş köşeye teslim olup olmadığını bildirmelisiniz.

Foreground ve Arka Plan Jobs

Bir iş foreground'da başlatıldığında (köpeksiz:79)), yuvarlak bir şekilde tamamlanıp, doğrulanmış sinyalleri kullanarak sinyalleri kullanmak için bekler.

Arka plan işleri (Güce:81) beklemeden başlatılır.Görüngedeki baskılar ve sonraki taksitlere devam eder.İş listesi PID, iş numarası, komut dizesi ve statüsü (işte, durdurul, yapılır) ile girişleri tutar.

İş Yönetimi Data Structures

Bir iş masası (örneğin, bir dizi struct) takip etmek için:

  • İş ID (parça tarafından verilen küçük tam tam tamsayı)
  • Süreç grubu ID
  • Süreç Listesi PIDs (biri boru hattında her komut için)
  • Durum (işlet, durdurul, sona er)
  • Komutan dizesi (örneğin)

HerFL:87) Etkilenen işin durumunu güncellemek, bir foreground işi sona erdiğinde, listeden çıkarın.For background jobs, user asynchronously (print a message like "[1]+ Done command).

Senaryo ve Batch Processing

Senaryo Execution

Senaryo dosyalarını desteklemek için, komut satırı bayrağı ekleyin (örneğin, [[Dönetici:88) veya yerleşik bir yerleşik-inurFLT:89) komutunu açar.

Obang işlemi ([Dönetici:90) isteğe bağlı ama basit: senaryo dosyasının ilk ikisi israfı:91) ise, çekirdek geri kalanını bir senaryo tercüman olarak yorumlayacaktır.

Kontrol Akışı

Tam senaryo desteği, ⁇ ve executor'un karmaşıklığını gerektirir: afkanlık ve basit bir komut zinciri (örneğin,00:94) .Üye ait olan bir emel, ⁇ ve executor'un karmaşıklığını artırır.

En az, çıkış kodlarına dayanan koşullu infaz desteği () sadece cmd1 başarılı olursa) bunu büyük bir değer olarak ele alabilirsiniz.Bunu ilk komutunu çalıştırın, çıkış durumunu kontrol edin ve bir sonraki durumu doğru şekilde uygulayın.

Hata Yönleri

Senaryolar genellikle sağlam bir hata işlemeye ihtiyaç duyar.Döneticileri uygulama.Döneticileri uygulama.Insage the script if any command goes. Ayrıca support.FLT:101). Bu özellikler küresel bir devlet makinesi ve dikkatli bir temizleme gerektirir (siz hafıza, kapanış dosyaları).

Gelişmiş Özellikler Gelişmiş Özellikler

Komutanlık Tarihi

Bir tarih mekanizması, kullanıcıların önceki komutları tekrar hatırlamasına ve yeniden düzenlemelerine izin verir. Son N komutlarını (örneğin, 1000) veya interaktif modda düzenleme ve tarih hatırlamasına izin verir.

Tab Tamamı

Tab tamamlanma komutları, dosyaları veya değişkenler gösterir.For files, you can use theİLFLT:106} Kütüphanenin mevcut ön ekleri eşleşen içeriklerini listeleyebilirsiniz.For command, scan theİLT:107| yönetmenler için.For variables, search the environment.This feature is a popular additional and string eşleştirme.

Değişken Altta ve genişleme

Basit bir şekilde, “Onay'ın ([[[değiştir | kaynağı değiştir) ve alt bir alt yerleşim ()) ve bir çocuk süreci için ([Dönetici) ve bir diziye göre, her biri ayrı bir parsing aşaması gerektirir.

Aliases

Aliases, kullanıcıların kısa el komutlarını tanımlamalarına izin verir (örneğin, www.C.D.) Bir hash masasındaki veya bağlantılı listedeki bir çağrıyı destekler.İlk token bir alias ile değiştirirse, genişlemeye dikkat edin.

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

C'de özel bir kabuk inşa etmek, birçok temel işletim sistemi konseptlerine dokunan kapsamlı bir projedir: Süreç yönetimi, sinyalleri, dosya tanımlayıcıları ve parsing. - iş kontrolü, piping, yönlendirme, senaryolama, ve ek rahatlıklar tarih ve sekme tamamlanma gibi, hem eğitim hem de pratik olan bir araç oluşturursunuz.Yazarsınız.Yazar ve Zsh işlerinizin nasıl çalıştığını anlayın ve modern kabuklar için takdir edineceksiniz.

Minimum döngü ve artımlı özelliklerle başlayın. Her bir ek olarak, özellikle birden fazla boru içeren kenar vakaları, arka plan süreçleri ve sinyal etkileşimleri. Birçok açık kaynak kabuk uygulamaları (örneğin, 0 )GNU Bash) ve [[Dönetici:2Zsh) işlem için kullanılabilir, çünkü kabuk davranışı için değişkenleri olarak.