Program ed
, minimalny edytor tekstu, nie może zostać zamknięty, wysyłając mu przerwanie za pomocą Ctrl- C, zamiast tego drukując komunikat o błędzie „?” do konsoli. Dlaczego nie ed
kończy się po otrzymaniu przerwania? Z pewnością nie ma powodu, dla którego tajemniczy komunikat o błędzie jest bardziej przydatny niż samo wyjście. Takie zachowanie prowadzi wielu nowych użytkowników do następującego rodzaju interakcji:
$ ed hello ? help ? exit ? quit ? ^C ? ^C ? ? ? ^D $ su # rm -f /bin/ed
Takie tragiczne marnotrawstwo - łatwe do uniknięcia, jeśli ed
zwyczajnie zgodzi się na przerwanie.
Innym upartym programem wykazującym podobne zachowanie, less
który również nie wydaje się mieć zbyt dużego powodu do ignorowania C-c
. Dlaczego te programy po prostu nie podpowiedziały?
Odpowiedzi:
Ctrl+ Cwysyła SIGINT . Konwencjonalną czynnością dla SIGINT jest powrót do pętli najwyższego poziomu programu, anulowanie bieżącego polecenia i wejście w tryb, w którym program czeka na następne polecenie. Tylko nieinteraktywne programy powinny umrzeć z powodu SIGINT.
Jest więc naturalne, że Ctrl+ Cnie zabija ed, ale powoduje, że powraca do pętli najwyższego poziomu. Ctrl+ Cprzerywa bieżącą linię wprowadzania i wraca do monitu ed.
To samo dotyczy mniej: Ctrl+ Cprzerywa bieżące polecenie i powoduje powrót do wiersza polecenia.
Z przyczyn historycznych ed ignoruje SIGQUIT ( Ctrl+ \). Normalne aplikacje nie powinny wychwytywać tego sygnału i pozwolić sobie na zakończenie, z zrzutem rdzenia, jeśli jest włączony.
źródło
Unix V7
ed(1)
kod źródłowy jest prymitywne 1762-linia C Program wystarczy kilka uwag, z których jeden jest to wysoce pouczające komentarz nagłówka:Biorąc pod uwagę, że sam kod źródłowy nie przedstawia żadnego uzasadnienia, otrzymasz go tylko od autora programu.
ed
został pierwotnie napisany przez Kena Thompsona w zespole PDP-11 , ale tak naprawdę trzeba porozmawiać z kimkolwiek, kto go przetransportował do C. To mógł być Dennis Ritchie , ponieważ stworzył C dla Uniksa i był jednym z wielu, którzy używali C do uczynić Unix przenośnym na maszyny inne niż PDP. Dr Ritchie nie jest już w pobliżu, aby odpowiedzieć na takie pytania.Moja lektura kodu sugeruje, że zrobiono to, aby zachować zawartość wewnętrznej kopii edytowanego dokumentu. Zauważysz, że inne edytory tekstu również nie umierają Ctrl-C.
Oto, co
ed
działa na Ctrl-C:(Tak, K&R C .. Nie potrzebujemy żadnych specyfikacji typu powrotu ani deklaracji parametrów steenkin).
Przetłumaczone na angielski
ed
:Ponownie rejestruje procedurę obsługi sygnału.
(Unix nie otrzymał sygnałów automatycznego resetowania aż do 4.3BSD , w połowie lat 80.)
Zapisuje nowy wiersz i pamięta, że to zrobił, za pomocą zmiennej globalnej
lastc
.(
ed.c
ma około sześćdziesięciu zmiennych globalnych).Wywołuje
error()
funkcję, która słynie niewiele więcej niż drukowanie?
, z perspektywy użytkownika.Innymi słowy, mówi: „Tak naprawdę nie chciałeś tego zrobić, prawda?”
źródło
error(s)
wed.c
jest powrót do głównej pętli procesu obróbki. Robi to za pomocąlongjmp()
połączenia. wzdrygam sięed
, podobnie jak inne programy interaktywne, użyj Ctrl+, Caby przerwać zadania samego programu.Jest to bardzo podobne do normalnego przypadku, w którym przerywa zadanie uruchomione w powłoce - polecenie.
Z perspektywy użytkownika oba warianty są bardzo podobne. Obsługa sygnału jest inna: w zwykłym przypadku sygnał
SIGINT
jest wysyłany do procesu pierwszoplanowego, do uruchomionego polecenia, a polecenie obsługuje je, wychodząc.W przypadku
ed
, sygnał jest wysyłany do procesu pierwszego planu,ed
instancji. Jeśli uruchomione jest zadanieed
, zostanie ono przerwane i wyświetlony zostanie monit. Jeśli nie ma uruchomionego zadania, nic się nie zmienia.Zauważ, że powłoka również nie wychodzi z Ctrl+ C, tak jak
ed
. I że wychodzi na Ctrl+ D. Znowu tak jaked
źródło
Istnieją trzy sygnały, na których
ed
zależy:INT
HUP
QUIT
Specyfikacja POSIX
ed
mówi o nich:Niezależnie od tego,
ed
jakiej implementacji używasz, jest ona zgodna ze specyfikacją POSIX w odniesieniu doINT
sygnału (który Ctrl+Cwysyła).Pod tym względem edytor zachowuje się jak interaktywna powłoka, która również nie kończy się po odebraniu
INT
sygnału. Inne edytory, takie jakvi
inano
robi to samo.źródło
ed
. Zachowuje się podobnie jak powłoka, która również nie kończy się po otrzymaniuINT
sygnału.