Neden Cc ile çıkılamıyor?


20

edMinimal bir metin editörü olan program , Ctrl- kullanılarak bir kesinti göndererek çıkılamaz C, bunun yerine "?" Hata mesajını yazdırır. konsol. Neden edsadece kesinti aldığında çıkmıyor ? Elbette, şifreli bir hata mesajının sadece çıkmaktan daha yararlı olmasının bir nedeni yoktur. Bu davranış, birçok yeni kullanıcıyı aşağıdaki etkileşim türlerine yönlendirir:

$ ed
hello
?
help
?
exit
?
quit
?
^C
?
^C
?
?
?
^D
$ su
# rm -f /bin/ed

Böyle trajik bir atık - edsadece kesintiye karar verildiği takdirde kolayca önlenebilir .

Benzer davranış sergileyen bir başka inatçı program lessda görmezden gelmek için fazla bir nedene sahip görünmüyor C-c. Bu programlar neden sadece bir ipucu almıyor?


4
Etkileşimli uygulamalar, etkileşimli olmayanlarla aynı değildir. Alıştığınız Ctrl-C davranışı, etkileşimli olmayanlar için varsayılan ayardır. Etkileşimli olanlar, Ctrl-C'nin davranışlarını kendi amaçları için geçersiz kılabilir.
jw013

4
Ayrıca, şaka
jw013 17:14

@ jw013 Evet, "tipik oturum" bir şakaydı (bir nedenden dolayı bulamadım) ama sorum ciddidir. Anlamadığım şey, bu uygulamaların gerçekten yararlı bir şey sağlamazsa neden Ctrl-C'nin davranışını geçersiz kılmayı seçmesidir.
Lily Chung

1
Bu soru, "ed çıkışından" en iyi bir Google arama yanıtı olarak geldiğinden, buraya sadece 'q' ve ardından bir dönüş olduğunu eklemek istiyorum. Birçok Bothan bize bu bilgiyi vermek için öldü.
Dmitri

Yanıtlar:


19

Ctrl+ SIGINTC gönderir . SIGINT için geleneksel eylem, geçerli komutu iptal ederek ve programın bir sonraki komutu beklediği bir moda girerek bir programın üst düzey döngüsüne dönmektir. Sadece etkileşimli olmayan programların SIGINT'ten ölmesi beklenir.

Bu yüzden Ctrl+ ' Cnın ed'i öldürmemesi doğaldır , ancak üst düzey döngüsüne geri dönmesine neden olur. Ctrl+ Cgeçerli giriş satırını iptal eder ve ed komut istemine geri döner.

Aynı şey daha azına gider: Ctrl+ Cgeçerli komutu keser ve sizi komut istemine geri getirir.

Tarihsel nedenlerden dolayı ed, SIGQUIT ( Ctrl+ \) 'ı yok sayar . Normal uygulamalar bu sinyali yakalamamalı ve etkinleştirilirlerse çekirdek dökümü ile sonlandırılmalarına izin vermemelidir.


@Kzqai Hayır, normal bir uygulama olmalıdır değil bir acil çıkış olarak pinti, SIGQUIT sinyalini yakalamak.
Gilles 'SO- kötü olmayı kes'

Ah, yakaladım. Tamam, geri çekildi.
Kzqai

18

Unix V7 ed(1)kaynak kodu bu son derece aydınlatıcı başlık comment bunlardan biri sadece birkaç yorumlarınız ile ilkel 1762-C hattı programıdır:

/*
 * Editor
 */

Kaynak kodun kendisinin herhangi bir gerekçe sağlamadığı göz önüne alındığında, bunu yalnızca programın yazarından alacaksınız.

edaslen PDP-11 meclisinde Ken Thompson tarafından yazılmıştı , ama aslında onu C'ye taşıyan herkesle konuşmanız gerekirdi . Unix için C'yi yarattığı ve C'yi kullanan birçok kişiden biri olan Dennis Ritchie olabilir Unix'i PDP olmayan makinelere taşınabilir hale getirir. Ancak Dr.

Kodu okuduğumda , düzenlenen belgenin çekirdek kopyasının içeriğini korumaya çalışıldığını gösteriyor. Diğer metin editörlerinin de ölmediğini göreceksiniz Ctrl-C.

İşte ne edyapar Ctrl-C:

onintr()
{
    signal(SIGINT, onintr);
    putchr('\n');
    lastc = '\n';
    error(Q);
}

(Evet, K & R C . Biz hiçbir steenkin' döndürme türü belirteçleri veya parametre bildirimleri gerekmez.)

İngilizce'ye çevrilmiş, ed:

  1. Sinyal işleyiciyi yeniden kaydeder.

    (Unix , 1980'lerin ortalarında 4.3BSD'ye kadar otomatik sıfırlama sinyalleri alamadı .)

  2. Global değişken aracılığıyla yeni bir satır yazar ve bunu hatırlar lastc.

    ( ed.cyaklaşık altmış küresel değişkene sahiptir.)

  3. Ünlü olarak baskıdan çok daha fazlasını yapan error()işlevi kullanıcının bakış açısından çağırır.?

Başka bir deyişle, "Bunu yapmak istememiştin değil mi?"


2
Ayrıca, birçok metin düzenleyicisinin Control-C'de çıkmadığını belirtmek gerekir. Vim de bilmiyor. Nano da öyle. Emacs'ın da yaptığını sanmıyorum, ama test etmek için yüklü değil.
derobert

3
@derobert Vi, Ctrl + C'ye Unix yöntemini uygular: en üst seviyeye geri dönün. Emacs, Unix olmayan kökenleri nedeniyle kendi tuş bağlantılarına sahiptir; Unix'in Ctrl + C'sinin Emacs eşdeğeri Ctrl + G'dir (zil karakteri - kesmek için bilgisayarda zili
çaldır

@derobert: Adil nokta. Bunu cevaba ekledim.
Warren Young

2
@Gilles: çağrı yan etkilerinden biri error(s)de ed.cana işlem döngüsüne döndürmektir. Bunu bir longjmp()çağrı ile yapar . titreme
Warren Young

1
Ayrıntılar ve tarih dersi için teşekkür ederim. Bu harika bir okuma oldu!
alichaudry

7

ed, diğer etkileşimli programlar gibi , programın kendisinin görevlerini kesmek için Ctrl+ Ckullanın.
Bu, normal durumda çok benzerdir, burada kabukta çalışan bir görevi keser - bir komut.

Kullanıcı açısından bakıldığında, her iki değişken de çok benzer. Sinyalin işlenmesi farklıdır: olağan durumda, sinyal SIGINTön plana gönderilir, çalışan bir komut ve komut çıkarak onu işler.
Durumunda, edsinyal, edörnek ön plan işlemine gönderilir . Çalışmakta olan bir görev edvarsa, kesilir ve bilgi istemi gösterilir. Çalışan bir görev yoksa, hiçbir şey değiştirilmez.

Bir kabuk ayrıca çıkmamalı nasıl Not Ctrl+ Ctıpkı ed. Ve Ctrl+ 'dan çıktığını D. Yine, tıpkıed


3

edÖnem veren üç sinyal var:

  1. INT
  2. HUP
  3. QUIT

POSIX spesifikasyonued bunlar hakkında şunları söylüyor:

SIGINT

Yardımcı edprogram geçerli etkinliğini kesmeli, dizeyi ?\nstandart çıktıya yazmalı ve komut moduna dönmelidir (GENİŞLETİLMİŞ AÇIKLAMA bölümüne bakın).

SIGHUP

Arabellek boş değilse ve son yazmadan bu yana değiştiyse, edyardımcı program tamponun bir kopyasını bir dosyaya yazmaya çalışacaktır. İlk olarak, ed.hupgeçerli dizinde adlandırılan dosya kullanılacaktır; bu başarısız olursa, ortam değişkeni ed.huptarafından adlandırılan dizinde adlandırılan dosya HOMEkullanılır. Her durumda, edyardımcı program dosyayı şu anda hatırlanan yol adına yazmadan ve komut moduna dönmeden çıkacaktır.

SIGQUIT

Kamu edhizmeti bu olayı görmezden gelecektir.

Böylece, hangi uygulamayı edkullanırsanız kullanın, INTsinyale ilişkin olarak POSIX spesifikasyonuna uygundur ( Ctrl+Cgönderen budur).

Bu bağlamda, editör, INTsinyali aldıktan sonra da sona ermeyen etkileşimli bir kabuk gibi davranır . Diğer editörler gibi vive nanoaynı şeyi yapar.


1
Bazı program uygulamaları POSIX ile kasıtlı olarak çelişmektedir, bu nedenle bu durumda standardın / bunun kırılmasının maliyetinin gerekçesini açıklamak yararlı olabilir. stackoverflow.com/questions/38605463/…
sourcejedi

1
@sourcejedi Standart, gerekçesindeki sinyaller hakkında hiçbir şey söylemez. Mevcut olan kaynaklarda standardın neden takip edildiğine dair hiçbir şey söyleyen hiçbir gerekçe bulamadım ed. INTSinyalin alınmasında da sona ermeyen kabuk ile benzer şekilde davranır .
Kusalananda
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.