Terminal emülatörleri
Ana taraf, terminale giden çizgiyi (TX / RX tel çifti) değiştirir.
Terminal , tellerden birinde aldığı karakterleri görüntüler (bunlardan bazıları kontrol karakterleridir ve imleci hareket ettirmek, rengini değiştirmek ... gibi şeyler yapmak) ve başka bir kabloya yazdığınız tuşlara karşılık gelen karakterleri gönderir.
Xterm gibi terminal emülatörleri , kablolara karakter göndermek ve almak yerine, dosya tanımlayıcılarındaki karakterleri ana tarafa okur ve yazar. Köle terminalini doğurduklarında ve kabuğunuzu bunun üzerine başlattıklarında, artık ona dokunmuyorlar. Tel çiftinin taklit edilmesine ek olarak, xterm, çizgi disiplini özelliklerinin bazılarını bu dosya tanıtıcısı aracılığıyla ana tarafa da değiştirebilir. Örneğin, boyut niteliklerini güncelleyebilirler; böylece değiştirilen bir boyutta onları bilgilendirmek için köle pty ile etkileşime giren uygulamalara bir SIGWINCH gönderilir.
Bunun dışında terminal / terminal emülatöründe çok az istihbarat var .
Bir uçbirim aygıtına yazdığınız şey (küçük köle gibi) orada gösterilmek istediğiniz şey, ondan okuduğunuz şey orada yazdığınız şeydir, bu yüzden terminal emülatörünün bunu okuyup yazması bir anlam ifade etmemektedir. . Diğer ucunda olanlar onlar.
Tty çizgi disiplini
Bir çok zeka olduğunu tty hat disiplin . Çizgi disiplini, bu aygıtla çizgi / tel (bir pty'nin ana tarafı) arasında oturan bir seri / pty aygıtının üzerine itilmiş (sürücüde, çekirdekte bulunan) bir yazılım modülüdür.
Bir seri hattın diğer ucunda bir terminali olabilir, fakat aynı zamanda bir fare veya ağ için başka bir bilgisayarı olabilir. Örneğin bir seri aygıtın (ya da pty aygıtının) bir ağ arabirimine erişmek için bir SLIP hattı disiplini ekleyebilirsiniz ya da bir tty hat disiplininiz olabilir. Tty satırı disiplini, en azından seri ve pty aygıtları için Linux'taki varsayılan çizgi disiplinidir. Linux'ta çizgi disiplinini ile değiştirebilirsiniz ldattach
.
Tty line disiplinini devre dışı bırakmanın etkisini yayınlayarak görebilirsiniz stty raw -echo
(bash isteminin ya vi
da terminali ihtiyaç duydukları tam modda ayarlamak gibi diğer etkileşimli uygulamaların , bu nedenle cat
deneyimlemek gibi aptal bir uygulama kullanmak istediğinize dikkat edin). Daha sonra, slave terminal cihazına yazılan her şey xterm'in okunmasını hemen ana tarafa getirir ve xterm tarafından master tarafa yazılan her karakter slave cihazından okumak için hemen kullanılabilir.
Çizgi disiplini, terminal cihazı dahili çizgi editörünün uygulandığı yerdir . Örneğin, stty icanon echo
(varsayılan gibi) a
yazdığınızda, xterm a
master'a yazar , daha sonra çizgi disiplini tekrar yankılanır ( görüntüleme a
için okumaya uygun hale getirir xterm
), ancak ikincil kısımda okumak için uygun bir şey yapmaz . Eğer geri tuşuna yazarsanız Sonra, xterm bir gönderir ^?
veya ^H
(bu kadar karakteri, çizgi disiplin ^?
veya ^H
tekabül erase
hat disiplin ayarı) ana a geri gönderir ^H
, space
ve ^H
için xterm
silmeka
az önce ekranını yazdınız ve hala köle tarafından okunan uygulamaya hiçbir şey göndermiyor, daha a
önce yazdıklarınızı kaldırmak için iç satır düzenleyicisi arabelleğini güncelleştiriyor .
Enter tuşuna Sonra, xterm gönderir ^M
çizgi disiplin bir ^ J (LF) için girişe dönüştüren (CR), ve bir uygulama üzerinde okuma (köle tarafında okumak için şimdiye kadar girdiğiniz gönderir /dev/pts/x
ne alacak LF'yi yazdınız, ancak a
sildiğinizden beri değil), ana tarafta iken imleci bir sonraki satıra ve ekranın başına götürmek için bir CR ve LF gönderir.
Hat disiplini, sinyalin ana tarafta bir karakter aldığında terminalin ön plan işlem grubuna gönderilmesindenSIGINT
de sorumludur ^C
.
Pek çok etkileşimli terminal uygulaması , bu disiplinin özelliklerinin çoğunu, kendileri uygulamak için devre dışı bırakır . Ancak, her durumda, terminalin ( xterm
) bununla çok az ilgisi olduğuna dikkat edin (gösterilmesi söylenenleri gösterme hariç).
Ve işlem başına ve terminal cihazı başına sadece bir oturum olabilir. Bir oturum, kendisine bağlı bir kontrol terminaline sahip olabilir, ancak bunu yapmak zorunda değildir (tüm oturumlar bir terminal açmadan başlayana kadar başlar). xterm
, kabuğunuzu çalıştırmaya zorladığı süreçte tipik olarak yeni bir oturum oluşturur (ve bu nedenle varsa başlattığınız terminalden ayrılır xterm
), /dev/pts/x
bu terminal cihazını yeni oturuma bağlayarak açtığı yeni olanı açar. Daha sonra bu süreçte kabuğunuzu çalıştırır, böylece kabuğunuz oturum lideri olur. Kabuk veya o oturumdaki herhangi bir etkileşimli kabuk tipik olarak işlem gruplarıyla hokkabazlık yapacak tcsetpgrp()
ve bu terminal için ön ve arka plan işlerini ayarlayacaktır.
Hangi bilgilerin tty disipline sahip (seri veya pty) bir terminal cihazı tarafından saklandığına gelince , genellikle stty
komutun gösterdiği ve değiştirdiği şey budur. Tüm disiplin yapılandırması: terminal ekranı boyutu, yerel, giriş çıkış bayrakları, özel karakter ayarları (^ C, ^ Z ... gibi), giriş ve çıkış hızı (pty'ler için geçerli değildir). Bu , Linux haritasında / ioctls öğesine ve / için ekran boyutuna tcgetattr()
/ tcsetattr()
işlevlerine karşılık gelir . Geçerli ön plan işlem grubunun terminal cihazında ( / , ioctls) depolanan başka bir bilgi veya mevcut giriş veya çıkış tamponu olduğunu iddia edebilirsiniz .TCGETS
TCSETS
TIOCGWINSZ
TIOCSWINSZ
tcsetpgrp()
tcgetpgrp()
TIOC{G,S}PGRP
Terminal cihazda depolanan ekran boyutu bilgilerinin gerçeği yansıtmayabileceğini unutmayın. Terminal emülatörü tipik olarak, penceresi yeniden boyutlandırıldığında (ana boyuttaki aynı ioctl aracılığıyla) penceresi yeniden boyutlandırıldığında ayarlayacaktır, ancak bir uygulama köle tarafındaki ioctl'i çağırdığında veya yeniden boyutlandırma iletilmediğinde senkronizasyondan çıkabilecektir (durumda örneğin ihmal sshd
ederse başka bir küçük ürüne işaret eden bir ssh bağlantısı . Bazı terminaller de kaçış dizileri aracılığıyla boyutlarını sorgulayabilir, böylece bir uygulama bu şekilde sorgulayabilir ve çizgi disiplinini bu bilgilerle güncelleyebilir.ssh
SIGWINCH
Daha fazla ayrıntı için, örneğin Debian'daki termios
ve tty_ioctl
man sayfalarına göz atabilirsiniz .
Diğer hat disiplinleriyle oynamak için:
Bir fareye sözde-terminal taklit:
socat pty,link=mouse fifo:fifo
sudo inputattach -msc mouse # sets the MOUSE line discipline and specifies protocol
xinput list # see the new mouse there
exec 3<> fifo
printf '\207\12\0' >&3 # moves the cursor 10 pixels to the right
Yukarıda, çukurun ana tarafı, socat tarafından adlandırılmış bir pipe ( fifo
) üzerine sonlandırılır . Bu fifoyu, fare sistemleri protokolünde, 0x87 0x0a 0x00 yazan bir işleme (kabuk) bağlarız no button pressed, delta(x,y) = (10,0)
. (Terminal cihazından bir uygulama tarafından (potansiyel olarak dönüştürülmüş) okunmamalıdır Burada, (kabuk) bir terminal, ama fare taklit olmamak üzere, biz göndermek 3 bayt olan mouse
, yukarıda yapılan bir sembolik olan socat
bazı /dev/pts/x
cihaz) , ancak bir fare giriş olayı olarak yorumlanmalıdır.
Bir SLIP arayüzü oluşturun:
# on hostA
socat tcp-listen:12345,reuseaddr pty,link=interface
# after connection from hostB:
sudo ldattach SLIP interface
ifconfig -a # see the new interface there
sudo ifconfig sl0 192.168.123.1/24
# on hostB
socat -v -x pty,link=interface tcp:hostA:12345
sudo ldattach SLIP interface
sudo ifconfig sl0 192.168.123.2/24
ping 192.168.123.1 # see the packets on socat output
Yukarıda, seri kablo socat
hostA ve hostB arasında bir TCP soketi olarak taklit edilir . SLIP hat disiplini, bu sanal hat üzerinden alınıp verilen baytları sl0
arayüzde teslimat için SLIP kapsüllenmiş IP paketleri olarak yorumlar .