Bir Linux terminali nasıl çalışır?


32

Bir terminali başlatıp çalıştırılabilir bir çağrı yaparsanız (basitlik için satır yönelimli olduğunu varsayarak) çalıştırılabilir komuttan bir yanıt alırsınız. Bu size (kullanıcı) nasıl yazdırılır? Terminal gibi bir şey yapar mı pexpect? (çıkış için bekleyen anket) ya da ne? Çıktılan çıktıdan nasıl haberdar edilir? Bir terminal nasıl program başlatır? (Python's os.fork'a benzeyen bir şey mi?) Bir terminalin nasıl çalıştığını merak ediyorum, bazı terminal emülatörleri ile oynuyorum ve hala bu sihrin nasıl çalıştığını anlamıyorum. Konsole (kde) ve yakuake (muhtemelen konsole kullanıyor) kaynağına bakıyorum ve o sihrin nerede olduğunu bulamıyorum.


6
Basit bir terminal emülatörüne ve basit bir kabuk (ve kitabının ilk onbeş sayfası) olan basit bir oyuncak işletim sistemine bir göz atın . Ayrıca, bu cevabı ilgili bir soruya okuyunuz .

2
Bu bağlantı aynı zamanda terminal konusuna ve tty tarihine de müdahale ediyor

@nwildner cool,
mike

Yanıtlar:


30

Başlangıçta sadece aptal terminalleri vardı - ilk başta aslında teletypewriters (bir elektrikli daktiloya benzer, ancak bir rulo kağıt ile) (dolayısıyla / dev / tty - TeleTYpers), ancak daha sonra ekran + klavye-kombinasyonları - sadece bir anahtar kodu gönderdi bilgisayara ve bilgisayara, terminale harfini yazan bir komut geri gönderdi (yani terminal yerel yankı olmadan, bilgisayarın terminale kullanıcının terminalde ne yazdığını yazması gerekiyordu) - bu sebeplerden biriydi. neden bu kadar önemli Unix komutları bu kadar kısa. Terminallerin çoğu seri hatlarla bağlandı, ancak (en azından) biri doğrudan bilgisayara bağlandı (genellikle aynı oda) - bu konsoldu. Yalnızca bir kaç kullanıcının "konsol" üzerinde çalışması için güvenildi (bu genellikle tek kullanıcı modunda kullanılabilen tek "terminal" idi).

Daha sonra xterm, ekran ve grafik ekran kartı, klavye, fare ve basit bir işlemcili bazı grafik terminaller ("xterminals" adı verilen, -program ile karıştırılmaması gereken ) vardı; bu da sadece bir X sunucusunu çalıştırabilir. Kendileri herhangi bir hesaplama yapmadılar, bu yüzden X istemcileri bağlı oldukları bilgisayarda çalışıyorlardı. Bazılarının sabit diskleri vardı, ancak ağ üzerinden de önyüklenebilirlerdi. PC'ler çok ucuz ve güçlü olmadan önce 1990'ların başında popülerdiler.

Bir "terminal emülatörü" - xtermveya gibi programlarla açtığınız "terminal penceresi" konsole- bu aptal terminallerin işlevselliğini taklit etmeye çalışır. Ayrıca PuTTY(Windows) gibi programlar terminalleri taklit eder.

"Konsol" (klavye + ekran) ve "bilgisayar" ın tek bir ünite olduğu PC ile, bunun yerine "sanal terminaller" (Linux'ta, Alt + F1'den Alt + F6 tuşlarına) gelir; eski tip terminalleri taklit ediyorum. Tabii ki, Unix / Linux, bir bekar kullanıcı tarafından sıkça kullanılan bir masaüstü işletim sistemi haline geldiğinde, şimdi işinizin çoğunu "konsolda" yapıyorsunuz, kullanıcıların daha önce seri hatlarla bağlanan terminalleri kullanmışlar.


Elbette programları başlatan kabuk. Ve çevre ayarları ile kendi kopyasını çıkarmak için fork-systemcall (C dili) kullanır, ardından exec-systemcall bu kopyayı çalıştırmak istediğiniz komuta dönüştürmek için kullanılır. Kabuk, komut tamamlanana kadar (komut arka planda çalıştırılmadıkça) askıya alınır. Komut stdin, stdout ve stderr için ayarları kabuktan devralırken, komut terminal ekranına yazacak ve terminal klavyesinden girdi alacaktır.


Ve aptal seri terminaller ile Xterms arasında en.wikipedia.org/wiki/Blit_(computer_terminal) vardı
sendmoreinfo

31

Bir terminali açtığınızda, xterm, gnome-terminal, lxterm, konsole gibi bir terminal emülatör programına başlıyorsunuz…

Terminal emülatörünün yaptığı ilk şeylerden biri, bir takma uçbirim tahsis etmektir (kısaca takma veya kısaca denilen). Pty, bir çift karakter aygıt dosyasıdır: terminal emülatörünün açıldığı taraf olan pty master ve terminal içinde çalışan programların açıldığı pty slave. Modern birliklerin çoğunda, efendi /dev/ptmx(her terminal emülatörünün açık olduğu) ve köledir /dev/pts/NUMBER. Sahte terminaller için çekirdek sürücüsü, hangi işlemin her bir bağımlı cihaz için master'ı kontrol ettiğini takip eder. Terminal emülatörü , ana cihazdaki bir ioctl vasıtasıyla ilgili köleye giden yolu alabilir .

Terminal emülatörü ana aygıtı açtığında, bir alt işlemi başlatır (genellikle bir kabuk, ancak karar vermek için terminal emülatörünü çalıştıran kullanıcıya bağlıdır). Öykünücü bunu bir programı çağırmak için her zamanki gibi yapar:

  • bir çocuk sürecine katlanmak ,
  • slave pty cihazını 0, 1 ve 2 dosya tanımlayıcılarında açmak (standart giriş, standart çıkış ve hata akışı),
  • alt süreçte kabuğu veya başka bir programı yürütün .

Çocuk (veya başka herhangi bir işlem) küçük köleye yazı yazdığında, emülatör, küçük ustanın girişini görür.

Tersine, emülatör ana cihaza yazdığında, köle üzerinde girdi olarak görülür.

Beklenti tam olarak aynı şekilde çalışır. Expect ve xterm gibi bir terminal emülatörü arasındaki fark, programı besledikleri girişi nereden aldıkları (script vs klavye girişi) ve çıktıyla ne yaptıklarıdır (log dosyası veya parser vs bir pencerede metin çizer).


Burada anlatılan şeyin basit örneklerinden biri olan ve busybox en uygulanması scriptkomutuyla , xgetptyfonksiyon ile işin çekirdeğidir /dev/ptmx.
Ruslan

@Benim İngilizcenin ana diliniz olmadığını takdir ediyorum. Ancak bir yayını düzenlerseniz, lütfen yanlış yaptığınızdan emin olun. Eğer anlamadıysanız, düzenlemeyin. Ayrıca, bir kez daha, vurgulanması gerekmeyen şeyleri vurgulamak için lütfen koyu kullanmayın.
Gilles 'SO- kötülük olmayı'
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.