CTRL + C'den sonra konsolun neden bazen sıfırlanması gerekiyor?


9

Bazı komut satırı arabirim araçları, tarafından iptal edildiğinde bozuk bir konsol döndürür CTRL+C. Bazen metin görünmez olabilir veya komutu çalışana kadar grafik sorunları olabilir reset.

(Ben bash kullanıyorum, ama kabuğundan bağımsız olmasını bekliyorum.)

Bu etkinin bir adı var mı? Buna ne neden olur ve programcılar araçlarda bunu nasıl önleyebilir? Bu problemin ana programlama dillerinde nasıl ele alındığına dair bir strateji var mı?



stty sanesakallar için
Thorbjørn Ravn Andersen

Yanıtlar:


14

Bazı işlemler (örn. Kabuğunuz tarafından başlatılan bir program) sona erdiğinde, sözde bir terminalin durumu değişmediğinden, bir konsolun bazen reset(1) (veya bazı stty(1)komutlara) ihtiyacı vardır .

Demystified tty okuyun .

( Sahte terminallerin ve sahte sahte isimlerin ele alınmasını Linux'un en zor kısmı olarak görüyorum)

Bu problemin ana programlama dillerinde nasıl ele alındığına dair bir strateji var mı?

Terminalle ilgilenen ve modunu veya hat disiplinini değiştiren iyi davranan bir program çökmeyi önlemek ve terminali doğru duruma getirmek için uygun çağrıları (bkz. Termios (3) ) yapmak için çok çalışmalıdır. BTW, ncurses veya readline gibi kütüphaneler yararlıdır (ancak temizleme rutinlerini uygun şekilde çağırmanız gerekir).

Bkz. Sinyal (7) ve sinyal güvenliği (7) . Kodunuzda kilitlenmeyi önlemek zordur. Tanımlanmamış davranış hakkında bilgi edinin .

Kusurlu bir geçici çözüm, programınızı çalıştıran ve daha sonra reset(bazen uygun olmayan) çalıştıran bir kabuk işlevi tanımlamak olabilir.


Bu geçici çözüm harika değil; bazen orijinal ayarlardan resetfarklı sttyayarlara neden olabilir .
Bob

Evet, belirttiğiniz için teşekkürler. "Kusurlu" ekledim.
Basile Starynkevitch

Bağlantılarınızı okudum, ilginçlerdi, ancak bu Q / A için bir bölüme bir işaretçi ekleyebiliyorsanız faydalı olurdu. Tty demystified okuduktan sonra stty -a > /tmp/test1bash sonra iptal bir komut başladı . Terminal rengi şimdi kırmızıydı. stty -a > /tmp/test2ancak test1ve test2tam olarak aynı idi.
Jonas Stein

1

Bu soruna yanıt vermek tamamen kabuktan bağımsız değildir. Zsh'de, ttyctltty modunu "dondurabilen" veya "çözebilen" yerleşik vardır . Bash'da bir eşdeğeri olduğunu sanmıyorum. settyTcsh komut aynı şeyi yapar, ama daha ince taneli: tek tek ayarları dondurabilirsiniz.

Tty modunun dondurulması, zsh'nin geçerli modu hatırlayacağı ve gelecekteki bir çocuk bunu değiştirirse, çocuk askıya alındığında veya sona erdiğinde mod geri yükleneceği anlamına gelir.

Bu sizi, terminali temizleyen veya bozmayan programların bazı kötü etkilerinden koruyacaktır. Bir değişiklik yapmak istiyorsanız dondurmayı unutmamalısınız stty, aksi takdirde kabuk sttyyaptığınız her şeyi hemen geri alır .

resetgeri yükleme sttymodlarından daha fazlasını yapar , bu yüzden bazen ihtiyacınız olabilir, ancak sık sık değil.


Gerçekten: stty -a> / tmp / test1'i bash'ta başlattım ve iptal ettiğim bir komut. Terminal rengi şimdi kırmızıydı. stty -a> / tmp / test2 ancak test1 ve test2 tam olarak aynıydı. Aynı şeyi tcsh ile denedim, ancak komutumu CTRL + C ile çökertemedim. Renkler iyi kaldı.
Jonas Stein
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.