Terminal açtığımızda çalışıyor.
luvpreet@DHARI-Inspiron-3542:/$
Daha yeni açtım. Peki, Ctrl+ tuşuna bastığımda Cneden kendini öldürüp terminali kapatmıyor?
Terminal açtığımızda çalışıyor.
luvpreet@DHARI-Inspiron-3542:/$
Daha yeni açtım. Peki, Ctrl+ tuşuna bastığımda Cneden kendini öldürüp terminali kapatmıyor?
Yanıtlar:
Ctrl+ Ckesme sinyalidir. Bunu bir terminale yazdığınızda, bash ön plandaki işe SIGINT'i gönderir. İş yoksa (yeni bir terminal açtığınızda olduğu gibi), hiçbir şey olmuyor. Terminal emülatör programı kabukta çalışan bir iş değildir, bu nedenle sinyali almaz ve kapanmaz.
Terminali bir kontrol tuşu ile kapatmak istiyorsanız, bash'ın çıkmasına neden olan Ctrl+ D(EOF) kullanın (ve terminali de kapatın ).
Ayrıca bakınız: Bash Acemi Kullanıcı Kılavuzu Sinyaller ve daha derinlemesine Sinyal işleme nasıl çalışır?
Not: Bu cevap, yorumlar yayınlandıktan sonra düzenlenmiştir.
bash
Ctrl-c'ye basıldığında herhangi bir programı sonlandıracağını sanmıyorum . Sadece hangi işlem grubunun aktif olduğunu ve çekirdeği terminal programından ctrl-c aldığında çekirdeğin bu işlem grubuna bir sinyal üreteceğini söyleyecektir.
^CTuş, diğer tuş vuruşlarını * gibi sihirli değil - Program odağı hangisi için anahtar kodu gönderir. (X’de, 0x4’e Csahip bir değiştirici için tuş kodu 54'tür Ctrl.) Tuş akışını alan program, bunlarla uygun bir işlem yapmaktan sorumludur - birçok GUI uygulamasında, tuş vuruşunun panoya kopyalandığını unutmayın.
Bir GUI terminal emülatörü (örneğin, Konsole) veya sanal bir terminal, yorumladığı bir tuş vuruşu aldığında ^C, üç şeyden birini yapabilir. Terminal ham moddaysa , çalışan program terminalden özel anahtarların kendisinin herhangi bir işlem yapmamasını ve doğrudan programa geçirmesini istedi. Satır düzenleme gibi gelişmiş özellikleri destekleyen bazı programlar, tüm ham tuş vuruşları ve işlenen metin satırları arasında bazı yapılandırmalarda klavye girişi alır; bash
, örneğin, her defasında bir kez tuş vuruşlarını alır. ^Cuçbirim tarafından yorumlanır, ancak geri alma tuşu kabuğa olduğu gibi gönderilir.
Ancak çoğu program, terminalin programa göndermeden önce bazı temel tuş vuruşlarını yorumladığı pişmiş modunu kullanır (çiğ olmadığı için) (bu nedenle geri alma özelliğini kullanabilirsiniz cat
). Bu modda, terminalin kendisi ^Ctuş vuruşlarını bir SIGINT
sinyale çevirir ve çocuk işlemine gönderir. Terminal sinyali ürettiğinden, kafası karışmayacak ve sonlandırılmayacaktır.
Ctrl
+ Alt
+ Delete
tuş kombinasyonu oldukça yakın büyü Windows dünyasında, (o kendi başına oldukça büyülü olduğunu, işe Windows'u almak için kullanılabilir!), Bu kodlanmış kesilmesine sisteme beri ve hemen hemen her şeyi geçersiz kılar SysRq
- bu anlamda oldukça benzer .
cbreak
/ -icanon
, ancak isig
mod kümesini terk eder ve bunlara eşlenen tuşlara bastığınızda gerçek sinyaller alır. SIGINT
Tanımladığınız gibi davranarak işler (sadece satır düzenlemeyi iptal etmez, aynı zamanda bir döngüde çalışabilecek herhangi bir dahili komutu da iptal eder) ve tamamen yok sayar SIGTSTP
ve SIGQUIT
. Vi gibi diğer programlar olmayabilir.
Ctrl
+ Alt
+ Delete
bugün olduğundan daha fazla sihirdi - blogs.msdn.microsoft.com/oldnewthing/20140912-00/?p=44083 . Kalbinde bir Linux insanı olsam da, çoğu zaman Windows'un ilk günlerde bu kadar sınırlı kaynaklarla işleri kullanıcı dostu ve mantıklı hale getirmesine şaşırdım.
^c
yoksa, pencere yöneticisini öldürmez :). Bir seferde ham / pişmiş karakter hakkında yorum yapamıyorum, ama cevap bu tuş vuruşunun nasıl üretildiğine dair bir noktaSIGINT
^CGenellikle (bakınız eşleştirilir stty -a
için) SIGINT
sinyal (bakınız man 7 signal
).
Yakalanmayan bir SIGINT
koşu süreci yarıyor, AMA ...
SIGINT
bir işlemin ("Bir sinyal yakalamak") için davranış belirleyebileceği sinyallerden biridir.
"Terminal" dediğiniz şeyi yakalar SIGINT
ve işe döner.
Yeni başlayanlarda, komut satırını kullanırken aslında iki ayrı program, bir terminal ve bir kabuk (örn. Bash) kullandığım kısmı eksikti.
Kabuk zaten bildiğiniz şeydir; giriş komutları veya komut dosyaları olarak alan, bunları yürüten ve çıktılarını basan bir program.
Diğer taraftaki terminal, kullanıcı ile bir program arasındaki ortadaki bir adam gibidir (bu, genellikle balık veya balık gibi bir programdır). Terminalin yaptığı şey, girişi klavyeden okumak, belki de bu girişi bir şekilde işlemek ve diğer programa (bash) yönlendirmektir.
Bu, diğer programda bir şey çıktığında, bir şey terminale yönlendirildiğinde, o zaman ekrana bir şey çıkarmak terminalin işidir. Giriş alma ve ekrana yazdırma arasında terminal, aldığı girişi çeşitli şekillerde yorumlayabilir.
Örneğin, bir program aşağıdaki sırayı verirse:
\e[0;31m some extra foobar text
Terminal, kırmızı renkli harflerle "bazı ekstra foobar metinler" ekranına çıkacaktır. Bunun nedeni , terminalin bu tuhaf kodu , aşağıdaki çıktıyı kırmızı ile yazdırmak için işaret eden özel bir şekilde ele almayı seçmesidir .
Benzer şekilde, kullanıcı bastığında Ctrl - C
, bununla ilgili tek özel şey, terminalin onu özel bir şekilde ele almayı seçmesidir, bu anahtar dizilimi ile ilgili başka özel bir şey yoktur. Spesifik olarak bu, kesme sinyali (SIGINT) terminalin içinde çalışan, yani kabuk olan prosese gönderilmesini ima eder. Eğer o anda, kabuk tarafından oluşturulmuş ve şu anda ön planda çalışmakta olan herhangi bir program varsa, o da sinyali alır. Şimdi kabuk bu sinyal için özel bir işleyiciye sahip ve hiçbir şey olmuyor. Ancak çoğu program SIGINT'in durumunda ortaya çıkan varsayılan işleyicilere sahiptir.
Her sinyalin kendisiyle ilişkilendirilmiş varsayılan bir eylemi vardır. Bir sinyal için varsayılan eylem, bir komut dosyası veya programın bir sinyal aldığında gerçekleştirdiği eylemdir.
Ctrl+ , işlemi ön planda çalışan işe sonlandırmak için varsayılan Colan "kesme" sinyalini ( SIGINT ) gönderir .
Ctrl+ D, terminale , standart olarak çıkışta bir arzu olarak yorumlayan bir EOF'yi kaydetmesi gerektiğini söyler .
Bir işlem INT sinyalini görmezden gelmeyi seçebilir ve Bash etkileşimli modda çalışırken bunu yapar.
Gönderen manuel :
Bash etkileşimli olduğunda, herhangi bir tuzak olmadığında, SIGTERM'i (yani, 0 öldürmek etkileşimli bir kabuğu öldürmez) göz ardı eder ve SIGINT yakalanır ve kullanılır (böylece beklemeye yerleşik yapı kesilebilir). Her durumda, bash SIGQUIT'i görmezden gelir. İş kontrolü etkinse, bash SIGTTIN, SIGTTOU ve SIGTSTP'yi dikkate almaz.
tuzak , donanım sinyallerine ve diğer olaylara cevap veren kabuğun içine yerleştirilmiş bir fonksiyondur. Kabuk sinyalleri veya diğer özel koşulları aldığında çalıştırılacak olan işleyicileri tanımlar ve etkinleştirir.
trap [-lp] [arg] [sigspec …]
-l
sinyal isimleri ve bunlara karşılık gelen numaraların bir listesini yazdır
-p
Her SIGNAL_SPEC ile ilişkili tuzak komutlarını gösterir.arg, kabuk sinyal sigspec'i aldığında okunmalı ve yürütülmelidir. Her sigspec, bir sinyal adı veya bir sinyal numarasıdır. Sinyal adları büyük / küçük harf duyarsızdır ve SIG öneki isteğe bağlıdır.
Bir Eğer sigspec olan 0 veya ÇIKIŞ , arg zaman kabuk çıkış yürütülür. Anlamak için, terminali kapatın ve .bashrc
dosyada aşağıdaki satırı düzenledikten sonra açın .
trap 'notify-send "Ctrl D pressed"' 0
Ctrl D, exit
terminalden çıkma komutuna benzer .
Bash'in INT sinyalini aldıktan sonra çıkmasını istiyorsanız, etkileşimli modda bile, aşağıdakileri ekleyebilirsiniz ~/.bashrc
:
trap 'exit' INT
veya
trap 'exit' 2