Bildiğim /dev/pts
kadarıyla, ssh veya telnet oturumları için dosyalar oluşturuluyor.
tty
.
Bildiğim /dev/pts
kadarıyla, ssh veya telnet oturumları için dosyalar oluşturuluyor.
tty
.
Yanıtlar:
Hiçbir şey kayıtlı değil /dev/pts
. Bu dosya sistemi tamamen bellekte yaşıyor.
Girişleri /dev/pts
olan uçbirimsi (kısaca Pty). Unix çekirdekleri genel bir terminal kavramına sahiptir . Bir terminal, uygulamaların çıktıyı görüntülemesi ve bir terminal cihazı aracılığıyla girdi almak için bir yol sağlar . Bir işlem kontrol terminaline sahip olabilir - bir metin modu uygulaması için, kullanıcı ile nasıl etkileşime girdiğidir.
Terminaller donanım terminalleri (“tty”, “teletype” için kısa) veya sözde terminaller (“pty”) olabilir. Donanım terminalleri, seri port ( ttyS0
,…) veya USB ( ttyUSB0
,…) gibi bir arabirim veya bir PC ekranı ve klavyesi ( tty1
,…) üzerinden bağlanır . Sözde-terminalleri bir uygulama olan bir terminal emülatörü tarafından sağlanmaktadır. Bazı sözde-terminal türleri:
Bir program yazmak için bir terminal açarsa, o programın çıktısı terminalde görünür. Aynı anda bir terminale çıkacak birkaç programın olması yaygındır, ancak bu, çıkışın hangi kısmının hangi programdan geldiğini söylemenin bir yolu olmadığı için kafa karıştırıcı olabilir. Kontrol terminallerine yazmaya çalışan arka plan işlemleri, bir SIGTTOU sinyali tarafından otomatik olarak askıya alınabilir .
Bir program okumak için bir terminal açarsa, kullanıcıdan gelen girdi o programa iletilir. Birden fazla program aynı terminalden okuyorsa, her karakter bağımsız olarak programlardan birine yönlendirilir; bu önerilmez. Normal olarak, belirli bir zamanda terminalden aktif olarak okuyan sadece bir program vardır; onlar olmadıkları zaman kendi kontrol terminalinden okumaya çalışın programlar ön planda olan otomatik bir SIGTTIN sinyali ile askıya .
Deney tty
yapmak için, terminal cihazının ne olduğunu görmek için bir terminalde çalıştırın . Diyelim ki /dev/pts/42
. Başka bir terminaldeki bir kabukta, run echo hello >/dev/pts/42
: string hello
diğer terminalde gösterilecektir. Şimdi çalıştırın cat /dev/pts/42
ve diğer terminale yazın. Bu cat
komutu (diğer terminalin kullanımını zorlaştıracak) öldürmek için Ctrl+ tuşlarına basın C.
Bir bildirimi görüntülemek için başka bir terminale yazmak bazen yararlı olabilir; örneğin write
komut bunu yapar. Başka bir terminalden okuma normalde yapılmaz.
strace
girdi okuyan programı, ama o kadar.
tostop
tty bayrağı ayarlanmışsa SIGTTOU olur . Bu bayrak varsayılan olarak ayarlanmamış. Ve ben de TTY’nin verdiği okumaya göre düzeltildim. Denedim ve işe yarıyor, ancak karakter başına değil, okuma başına esasına göre çalışıyor (kabuk isteminde otururken kabukları aynı anda 1 karakter okuyorlar). Bu noktayı netleştirmek iyi olabilir, çünkü şimdi cevabınızı yorumladım.
read
çağrının yalnızca ardışık karakterleri (veya daha doğrusu bayt, söylemeliyim) döndüreceğini, ancak uygulamanın bir read
çağrının kaç bayta döneceğini kontrol etmemesidir , bu yüzden daha iyi olmaz.
İçindeki dosyalar /dev/pts
"sözde ttys" dir. Bir ölçüde adlandırılmış borular gibiler, ancak VT-100'ler gibi eski seri bağlantı terminallerini de taklit ediyorlar. Sözde tty'ler, baytları klavyeden programa ve programdan çıkış cihazına aktarma işini yapar; Fakat bu açıklık sorunuzu yanıtlar: çekirdek /dev/pts/0
, örneğin hiçbir şeyi saklamaz . Yalnızca sözde-tty'ye bağlı bir programın stdoutundan gelen bayt akışları girer ve stde'si aynı sözde-tty'e bağlı olan programlar bu baytları okur.
Sözde tty'ler ayrıca bu bayt akışlarına bir dolaylı katman katmanı da sağlar. Çekirdek, baytları "Control-C" veya "Control-D" veya "Control-U" (tümü yapılandırılabilir, bkz. man stty
) Gibi özel değerler açısından inceleyebilir ve bir SIGINT gönderebilir, dosya sonunu stdin olarak ayarlayabilir veya silebilir Girişte bir çizgi. Ayrıca bir yerlerde tamponlama işlevi de var, bu yüzden "hiçbir şey depolamam" biraz yanlış, ama sadece birkaç kilobayt.
Çekirdek, çıktıdaki bayt değerlerini denetleyebilir ve yeni bir satırı (ASCII satır beslemesi, LF veya "\n"
) iki bayta çevirme, satırbaşı ve satır beslemesine (CRLF veya "\r\n"
) veya seri terminal donanımının gerektirdiği bayt değerlerine benzer şeyler yapabilir . Bir takma bilginin indirilmesi, donanımdan bağımsızlığa izin verir.
Sözde tty'ler ayrıca tüm "set baud rate", "set parite" ve benzeri ioctl()
sistem çağrılarına izin verir ve muhtemelen onlarla hiçbir şey yapmazlar. Bu VT-100s, ADM-3 ve Wyse günlerinde yazılan programların hata yapmadan çalışmaya devam etmelerini sağlar. Yazılım, sözde ttys aygıt sürücüsü, donanım gibi davranır.
Sahte-tty'ler sshd
ve tarafından kullanılabilirler telnet
, ancak bir terminal emülatörü ( xterm
veya veya benzeri rxvt
) ile tipik olarak xterm içinde çalışan kabuk arasında da kullanılırlar .
Linux ve bir çok Unix taklitçiye sahip. Plan 9 yapmaz. Sözde tty'ler, seri kablo bağlantılı donanım terminallerinin günlerinden geriye kalan, biraz eski bir eser.
/dev/
cihaz dosyaları için özel bir dizindir. Bunlar soyutlamalar, diskteki gerçek dosyalar değil. Dizin, önyükleme sırasında doldurulur ve çekirdek ve bir kullanıcı alanı cini tarafından oluşturulan ve tahrip olan mevcut cihaz arayüzlerini yansıtacak şekilde değiştirilebilir udevd
.
Bu şekilde gösterilen cihazların çoğu sanaldır. Bu, /dev/pts
konsol cihazları olan girişleri içerir . Bu yüzden uzak oturumlar için bir tane yaratıldı; yerel bir GUI terminali açtığınızda da oluşturulurlar.
Çok fazla kullanım değeri olmasa da, dosyaları dosya olarak açabilirsiniz. /dev/pts
Kabuğunuzun bağlı olduğu düğümü almak için şunu kullanın tty
:
> tty
/dev/pts/4
Şimdi başka bir konsola geçip şunu deneyin:
> echo "duck!" > /dev/pts/4
Zeki. Şimdi dene:
> cat /dev/pts/4
Ardından, / dev / pts / 4 adresindeki kabuğu deneyin. Çıkmak kadar saplanmışsın cat
diğer tarafta ama puanlar / 4 yazdıklarınıza çoğunu geçecek (örn çalışıyor "merhaba dünya" Ben ile sona erdi hl
puanlar üzerinde / 4 ve ello word
üzerinde cat
konsolun).
Buradaki tahminim, aygıtın kabuktan girdi aldığı ve sistemden çıktı aldığı, yani ekranda işlerin nasıl bittiği - kabuk donanım ile ilgili değil, sistem. Deneyin strace bash
(ve man strace
ne olduğunu bilmiyorsanız bir göz atın ); bash başlar gibi çağrıların ön telaşı olsun. Şimdi tuşlara basmaya başlayın:
read(0, "h", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "e", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "y", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
Yazılan her harf için standart girdiden bir okuma ve standart çıktıya bir yazma vardır. Fakat kabuğun standardı neyle bağlantılı? Şimdi strace
GUI terminalinizi deneyin - eğer bilmiyorsanız adı bulmak zorundasınız, örneğin KDE'de konsole
ve GNOME'da var gnome-terminal
sanırım. Bunun çıktısı strace
muhtemelen daha şifreli - benimki ise poll()
ve recvfrom()
. Yazıyor görmüyorum, ancak cat
hileyi başka bir terminalden alırsanız, yazarken fark edersiniz, kedi tarafından okunan tuş vuruşlarının strace çıktısında hiç bir yanıt vermemesine neden olur - terminal Onları alma. Bu yüzden GUI terminal uygulaması ve kedisi, kabuğun çıktığı aynı cihazdan okumak için yarışıyor.
echo Hello > /dev/pts/1
... Ne olduğunu görün, bu sizin terminaliniz.