/ Dev / pts dosyalarında ne saklanır ve bunları açabilir miyiz?


73

Bildiğim /dev/ptskadarıyla, ssh veya telnet oturumları için dosyalar oluşturuluyor.


6
echo Hello > /dev/pts/1... Ne olduğunu görün, bu sizin terminaliniz.
Sepahrad Salour


1
@SepahradSalour kişi pts sayısını kendi bağlamına uyarlamalıdır. sshd oturumum için / dev / pts / 30 kullandı.
Gab,

2
@Gab 是 current Geçerli terminalinizin yerini bulmak için komutu kullanabilirsiniz tty.
JeromeJ

Yanıtlar:


110

Hiçbir şey kayıtlı değil /dev/pts. Bu dosya sistemi tamamen bellekte yaşıyor.

Girişleri /dev/ptsolan 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:

  • Xterm, gnome-terminal, konsole,… gibi GUI uygulamaları klavye ve fare olaylarını metin girişine dönüştürür ve çıktıyı bazı fontlarda grafik olarak görüntüler.
  • Metin modu uygulamalarını gerçek terminalden ayırmak için, ekran ve tmux röle girişi ve çıkışı gibi diğer bir terminalden çoklayıcı uygulamalar.
  • Sshd, telnetd, rlogind,… gibi uzak kabuk uygulamaları, istemcideki uzak terminal ile sunucudaki pty arasında girdi ve çıktı iletir.

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 ttyyapmak 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 hellodiğer terminalde gösterilecektir. Şimdi çalıştırın cat /dev/pts/42ve diğer terminale yazın. Bu catkomutu (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 writekomut bunu yapar. Başka bir terminalden okuma normalde yapılmaz.


Ya söylemeye çalıştığın şeyi yanlış anlıyorum ya da bilgin kapalı. Terminale yazılan arka planlı işlemler SIGTTIN ile sonuçlanmaz. Terminalden aynı anda birden fazla program okunamaz ("her karakterin bağımsız olarak yönlendirildiği" ifadeniz). Herhangi bir zamanda terminalden yalnızca bir program okuyabilir ve arka planlı bir programın bu terminalden okuma girişimi bir SIGTTIN ile sonuçlanır. SIGTTIN'in otomatik olarak gönderildiği tek durum budur.
Patrick

Ayrıca başka bir terminalden okuyamazsınız. Bunu yapmak, verileri engelleyebildiğiniz için önemli bir güvenlik açığı olacaktır. Şunları yapabilirsiniz stracegirdi okuyan programı, ama o kadar.
Patrick

4
@Patrick Background terminale yazma işlemleri bir yazım hatası oldu SIGTTOU olsun. Çoklu programlar olabilir aynı anda terminalden okumak (ben bir sonraki paragrafta tarif yol denemek ve görmek; kimin terminali kontrolünden terminali olmayan bir süreçten bunu yapmak zorunda). Evet, size ait olduğu sürece başka bir terminalden okuyabilirsiniz - bunun neden imkansız olacağını düşünüyorsunuz?
Gilles,

Terminale yazma işlemi, arka plan işlemlerinde ancak tostoptty 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.
Patrick

2
@Patrick Bir 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.
Gilles,

18

İç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 sshdve tarafından kullanılabilirler telnet, ancak bir terminal emülatörü ( xtermveya 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.


13

/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/ptskonsol 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/ptsKabuğ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 catdiğer tarafta ama puanlar / 4 yazdıklarınıza çoğunu geçecek (örn çalışıyor "merhaba dünya" Ben ile sona erdi hlpuanlar üzerinde / 4 ve ello wordüzerinde catkonsolun).

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 stracene 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 straceGUI terminalinizi deneyin - eğer bilmiyorsanız adı bulmak zorundasınız, örneğin KDE'de konsoleve GNOME'da var gnome-terminalsanırım. Bunun çıktısı stracemuhtemelen daha şifreli - benimki ise poll()ve recvfrom(). Yazıyor görmüyorum, ancak cathileyi 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.


sıkışıp kaldığımızda 'cat / dev / pts / 4' kullanımı nedir ve bu komutu uygularken neden takıldığımızı.
user2720323

Bunu denemek ve açıklamak için birkaç paragraf ekledim.
goldilocks
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.