Ctrl-c tuşlarına birkaç kez basılması, çalışan programın daha hızlı kapanmasına neden olur mu?


41

Sık sık büyük bir dosya okumaya başlar ve bir süre sonra çıkmak isterim, ancak
Ctrl+ tuşlarına basıldığında Cprogram durur. Ctrl+ CTuşuna birkaç kez basarak gecikmeyi kısaltma şansı var mı ? Yoksa tuş basımı mı harcıyorum?


Çeşitli çocuk işlemlerini çağıran bir işlemi çalıştırırken, Ctrl-C'nin bazen çalışan çocuğu keseceğini fark ettim, ancak ana süreci değil. Bu doğrudur bash, ancak zshebeveyni daima kapattığı durum bu değildir . Sevdiğim sebeplerden biri bu zsh.
joeytwiddle

17
Evet, aynı asansör düğmesine basmak veya çapraz basma düğmesine arka arkaya basmak, asansörün daha erken gelmesine veya ışığın daha hızlı yeşile dönmesine neden olur.
Michael

3
Evet, asansör ve yaya geçidi düğmeleri gibi, CTRL-C de yapışkan ya da paslı olabilir ya da iffy bağlantılar geliştirebilir. Daha fazla kez basmak iyi bir taktiktir, çünkü asansörün gelmesi, yürüme işaretinin yanması veya programın kapanması için sadece bir basın kayıt yaptırmak zorundadır.
hippietrail

1
@hippietrail ancak kabuğunuz ^Cbasına kaydolduğunda yazdırılacak (en azından bash yapar)
wchargin

1
Ne pahasına olursa olsun, basma basamamı boşa harcamayı düşünmüyorum - zararsız bir şekilde biraz hayal kırıklığı yarattığını düşünüyorum. (Ben genellikle bunu 2-3 kez vurdun, ama her zaman makineyi ulaşan her tuş güvenemeyecekleri telefon hatları üzerinden bağlanmış terminaller "üzerinde büyüdü" çünkü kısmen bu.)
keshlam

Yanıtlar:


35

Birincisinden sonra, Ctrl-Cprogram alacak SIGINTve genellikle temizlemeye başlayacaktır (tmp dosyalarını silmek, soketleri kapatmak, vb.). Eğer vurursanız Ctrl-Co devam ederken yine, olabilir sen (yani ek sinyal temiz yukarı kesme yordamı gerçekleşmesi olabilir arkasında bir karmaşa bırakarak yerine yalnız kalmaktan üzerine hareket). Bu genellikle durum olmasa da, daha yaygın ek sinyaller aslında gönderilir sonraişlem bitti (operatörün sistemle etkileşimindeki içsel gecikmeler nedeniyle). Bu, sinyallerin başka bir işlem tarafından alındığı anlamına gelir (genellikle kabuk, ancak her zaman değil). Eğer bu alıcı bu sinyali doğru şekilde ele almazsa (kabuk genellikle olduğu gibi - Jenny D'nin cevabına bakınız) böyle bir eylemin sonucu sizi şaşırttı.


Neden temizleme rutini kesmeli? Bu sadece INTsürecin aldığı başka bir sinyal .
kaos

4
@chaos Neden olmalı? Eğer temizleme rutini kapatılmışsa ve onu durdurmak istiyorsanız. Aslında bu şekilde çalışıyor mu? Evet, oldukça sık. Yeterince gösterebilirsin: tek satırla bir bash betiği hazırla trap "sleep 20 || echo clean up cancelled!" EXIT ; sleep 10. Komut dosyasını çalıştırın ve iki kez ctrl-C tuşlarına basın. İkinci ctrl-C'nin "temizleme" yordamına (trap deyiminde) geçtiğini ve sleepkomutunu sonlandırdığını göreceksiniz .
John1024,

1
@ John1024 Ah, şimdi anlıyorum. Senaryo pasajı için teşekkürler ^^ Ancak, temizleme iptal edilmedi. Bkz: trap "sleep 20 || echo clean up cancelled!; sleep 10; echo 'but continued'" EXIT ; sleep 10Sadece sleepsinyalleri alan komutlar. İkimiz de hatalıydık xD
kaos

2
Bu yanlış. Sinyal iletimi senkronizedir. Eğer isigilgili, en kısa CTRL Cı çekirdek tarafından bastırılır ve alınan olarak (bir terminal emülatör kısa terminal emülatörü uçbirimsinin ana yanına yazar gibi), SIGINT sinyali gönderilir Tüm terminalin ön plan işlem grubunda işlemler. Orada engellenmiş olabilir, ancak daha sonra başka bir işleme teslim edilmeyecektir. Terminal aygıtı arabelleği dolu olsa bile (uygulamalar yazdığınız öğelerin hiçbirini okumamış olsa da), CTRL-C kuyruğu atlayacaktır.
Stéphane Chazelas,

1
Evet, bir örnek olarak VLC, çoklu Ctrl + C sinyallerini temiz olmayan bir şekilde çıkmanın bir yolu olarak yorumlarken, tek bir Ctrl + C temiz bir şekilde çıkmayı deneyecektir.
Jeremy Visser

11

Onları boşa harcıyorsun. Bütün bunlar, sunucu ekran çıktısını tamamladığında, birden fazla alacağıdır Ctrl-C. Birincisi, süreci öldürmek için kullanılacak ve takip edenler kabuğunuzda sona erecek ve daha sonra şöyle bir şey görünecek

[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ ^C
[user@server]$ 

6
Bir SIGINT gönderirken işlem mutlaka çıkmaz. Süresiz olarak hayatta kalabilir ve Ctrl + C'ye her basıldığında farklı bir şey yapabilir.
Brian Gordon

Doğru. Kullanıcının dosyayı nasıl okuduğu hakkında varsayımlar yapıyordum.
Jenny D

5

Kısa cevap: Eğer süreç buna tepki verirse.

Uzun cevap: ctrl+ tuşuna bastığınızda c, çekirdek işleme bir sinyal gönderir. Hangi komut aşağıdaki komutla belirlenebilir:

user@host:~# stty -a | grep -i "\^C"
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

Man sayfasına bakınız stty:

   intr CHAR
          CHAR will send an interrupt signal

Aynı INTzamanda 2 sayısı olarak da bilinen sinyaldir . İşlem bir sinyal işleyiciye sahip olduğunda buna tepki verebilir. Çoğu işlem başarıyla sonuçlanmak için bazı temizleme işleri yapar.


Ctrl-Z genellikle kullanılabilecek SIGTSTP'yi gönderir (SIGSTOP'un aksine).
Peterph

4
Hayır, SIGINT'i işleme gönderen kabuk değildir. It kernelön işlemi her sürece SIGINT gönderir (terminali terminal sürücü hat disiplin) grubunun terminal.
Stéphane Chazelas,

Gelecekteki okuyucular, ayrıca bkz. Unix.stackexchange.com/a/120071/135943 .
Wildcard

4

Haklısın. Tuşlara harcanıyor. Tuşuna bastığınızda Crtl+Cve algılandığında, temizlenmesi gereken kaynaklar vardır, bu yüzden zaman alır. Basmanın nerede Ctrl+Cgerekli olduğunu bildiğim olası bir durum , Yum güncelleme işlemini iptal etmek istediğiniz zamandır; Yum, Ctrl+Cgerçekten iptal etmek istediğinizi onaylamak için iki kez basmanızı ister.


2

Ctrl-CGenel davada sadece bir tanesi gerekli olmakla birlikte, gerekli olabileceği bazı durumlar vardır. Python, örneğin, Ctrl-Cyeni bir iş parçacığı üretilirken tuzak kurar ve eğer bir çok iş parçacığı başlatmanın ortasında bir şeyler ters giderse, pythonana işleme girmeden üst işlemi yapması için tekrar tekrar göndermek gerekir. yakalandı.


1
Bu şimdi başıma geliyor ve sonra çok iş parçacıklı / işlenmiş python komut dosyaları oluşturduğumda. Bazen ana süreç öldürülmeden önce birkaç basıma ihtiyaç duyulur.
Leo

0

Ben hep basın zorunda Ctrlcbirden çok kez. Hiçbir zaman ilk basına yanıt vermedim ve sistem gerçekten bir Ctrlcgönderinin gerçekleştiğini anlayana kadar defalarca kullanmak zorunda kalmamıştım . Aslında çoğunu özlüyor / kaybediyor gibi görünüyor.

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.