Hangi uygulamanın klavyeden sinyal alacağına kim karar verir?


16

Terminaldeki klavyeden gelen sinyalleri şu anki anlayışım (gözlemlerimi google'da bulunanlarla eşleştirmeye çalışarak) şu şekildedir:

  • Kullanıcı Cc'ye basar
  • Bu, terminalin giriş arabelleğine, 7 bitlik ascii c değerinden en soldaki 2 bitin temizlenmesi ile hesaplanan bir bayt olarak gönderilir

Bundan sonra gerçekten sisli olmaya başlar, çünkü hangi girdinin yapılandırılması terminalde hangi sinyalin yapıldığı anlamına gelir (stty). Sanırım bu terminalin kendisinin sinyali işleme gönderdiğini gösteriyor. Ama yine de bu terminal onu okuyan uygulama hakkında bilmiyor olsa da.

Terminalde klavyeyle sinyal gönderme uçtan uca nasıl çalışır?


1
Kendi başına bir cevap değil, ama okumaya değer: TTY , lft tarafından demistleştirildi.
duskwuff -inactive-

Yanıtlar:


33

Presleme Csırasında Ctrlbasıldığında terminal emülatörü için keyrelease X11 olayı takiben bir tuş gönderir.

Bu olay (genellikle tuşa basıldığında), terminal öykünücüsü ^C, sözde tty aygıtının ana tarafındaki dosya tanımlayıcısına 0x3 bayt ( ) yazar .

Eğer isigtermios cihazın ayarlanması ile ilgili olup olmadığını ve intrbu ayar, bu 0x3 bayta ayarlanır, sonra çekirdek tüm üyelerine sigint sinyali gönderir ön işlem grubunda , terminal cihazı (Pty cihazında depolanan bir nitelik) arasında. Bu durumda, 0x3 baytı pty'nin slave tarafında okunamayacak.

setpgid()Kabuk işleri için süreç grupları (ile ) oluşturan ve hangisinin ön plana ( tcsetpgrp()pty cihazının bu niteliğini ayarlamak için) koyup koymayacağına karar veren etkileşimli kabuklardır .

Örneğin, etkileşimli bir kabuğun isteminde çalıştığınızda:

foo | bar

Kabuk, iki işlemle (yürüttüğü foove barstdin / out'larını bir boru ile bağladıktan sonra) yeni bir işlem grubu başlatır ve bu grubu ön plana çıkarır. Ctrl-C tuşlarına basarsanız her iki işlem de SIGINT alır.

İçinde:

foo | bar &

Aynı ancak işlem grubu ön plana konmaz (ve kabuk da beklemez, böylece diğer komutları girebilirsiniz). Bu işlemler SIGINT'i Ctrl-C üzerine almaz ancak tty cihazından okumaya çalışırlarsa askıya alınabilir.

Daha fazla okuma: Her Pseudo-Terminal (PTY) bileşeninin (yazılım, ana taraf, ikincil taraf) sorumlulukları nelerdir?


2
Zengin cevap için teşekkürler. Anladığımdan emin olmak için cevabın çekirdeğini yeniden yazmaya çalışacağım: Sinyal, tty aygıtının aygıt özniteliklerinde yapılandırılan giriş için kendisini izleyen çekirdek tarafından gönderilir (yapılandırmak isteyen herkes tarafından). ve çekirdek, aygıt özniteliklerinde de yapılandırılan işlem grubuna gönderir (temel olarak bir oturum liderinin görevlerinden biri olarak kabuk tarafından). Umarım bu doğrudur.
calavera.info

1
@ calavera.info, evet doğru. Seri kablonun sonunda gerçek bir terminal olması durumunda, çekirdek kablodan gelen 0x3 baytını arar. Bir sahte terminal için ana taraf telin yerini alır. Ve çekirdek, terminal emülatörü tarafından gönderilen baytlarda 0x3 baytını arıyor. Daha fazla ayrıntı içeren başka bir Soru-Cevap bağlantısı ile düzenlemeye bakın (çekirdek işlemenin, cihaz "terminal" cihaz olarak kullanıldığında yapılan modüler tasarımın bir parçası olduğu gibi (terminal hattı disiplini )
Stéphane Chazelas

Soru , terminal öykünücüsü yerine terminali söylemedi mi? Öykünücünün işlevinin olabildiğince bir terminal gibi davranması göz önüne alındığında, çok fazla fark yaratmadığını sanmıyorum ...
Toby Speight

2
@Toby, evet, bu günlerde hiç kimse gerçek terminali kullanmadığından, OP'nin terminal emülatörleri anlamına geldiğini varsaydım (çoğuna "terminal" denir). Daha fazla ayrıntı için yukarıdaki yorumuma ve bağlantılı Soru-Cevap bölümüne de bakın.
Stéphane Chazelas

1
@TobySpeight Evet, bir terminal hakkında soruyordum çünkü seri hat üzerinden gerçek terminalle uğraşıyorum, ancak cevap ve aşağıdaki yorumlar her iki durum için de tamamen geçerliydi.
calavera.info
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.