Ctrl-C neden Terminal'in kendisini öldürmüyor?


38

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?


21
terminal terminalde çalışmıyor ;-)
Pilot6

3
kontrol- d'nin
Janus Troelsen

Yanıtlar:


47

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.


4
Uygun terim, kabuğun sinyali "hapsettiği" şeklindedir. Başka bir pencerenin içinden bir terminal penceresi açtığınızda farklı hikaye. Ctrl + c tuşlarını ana pencereye göndermek alt işlemi öldürebilir.
Sergiy Kolodyazhnyy

1
Ek olarak, GUI pencerelerine X11 sunucusundan gelen belirli sinyalleri yakalamak için de talimat verilebilir. Böylece kaydedilmemiş çalışmalardan sizi haberdar eden pop-up'lara sahip olabilirsiniz ya da tarayıcılardaki gibi açık sekmeleri açabilirsiniz
Sergiy Kolodyazhnyy

8
@ chrylis, terminal programı ctrl-c karakterini gönderir, aslında sinyale dönüştüren çekirdek katmandır.
Random832

3
@chrylis: Terminal veya içinde çalışan bir program - örneğin bir metin editörü - Ctl-C'yi başka bir eyleme çevirebilir.
jamesqf

3
bashCtrl-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.
kasperd

32

^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 SIGINTsinyale çevirir ve çocuk işlemine gönderir. Terminal sinyali ürettiğinden, kafası karışmayacak ve sonlandırılmayacaktır.

  • SysRq gerçekten sihir.

Belli ki burada süper-alakalı değil, fakat genel bilgi işlem için orada daha fazla sihirli tuş vuruşları var. En meşhuru Ctrl+ Alt+ Deletetuş 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 .
KRyan

7
Bash ham modu kullanmaz - her seferinde karakter kipini kullanır , yani cbreak/ -icanon, ancak isigmod kümesini terk eder ve bunlara eşlenen tuşlara bastığınızda gerçek sinyaller alır. SIGINTTanı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 SIGTSTPve SIGQUIT. Vi gibi diğer programlar olmayabilir.
Random832

1
@KRyan Ctrl+ Alt+ Deletebugü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.
Muzer

Bazı işletim sistemlerinde, başka bir program sisteme odaklanmış olsa bile (sanırım pencere yöneticisi?) Terminal emülatörü gelmeden önce tuşlara basıyor. Klavye kısayollarını pencereleri sabitlemek için yapılandırabilirseniz, uygulamaları açın, komut dosyalarını tetikleyin ve ardından basılan tuşlar terminal emülatörüne gönderilmeden önce yapılandırdığınız kısayollar için kontrol edilirler. Açık olan başka bir uygulamanız ^cyoksa, 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
Ajay

2
" pişmiş mod (çiğ olmadığı için)": Ben ... suskunum. Bunca yıldan sonra bağlantıyı hiç yapmadım.
isanae

8

^CGenellikle (bakınız eşleştirilir stty -aiçin) SIGINTsinyal (bakınız man 7 signal).

Yakalanmayan bir SIGINTkoş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 SIGINTve işe döner.


7

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.


5

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.


İle anlayın trap :

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
-pHer 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 .bashrcdosyada aşağıdaki satırı düzenledikten sonra açın .

trap 'notify-send "Ctrl D pressed"' 0

Ctrl D, exitterminalden çı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

1
okunaklı görünüyor!
luv.preet
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.