W Bash dowiedziałem się, że sygnał końcowy można zmienić tutaj. Ale jak domyślnie mogę sygnalizować koniec wejścia standardowego?
Zdarzyło mi się, że w przypadku cat i chardet ich wejścia standardowe mogą być sygnalizowane jako zakończone przez Ctrl + d. Wydaje mi się jednak, że pamiętam, że Ctrl + d i Ctrl + c są podobne do zakończenia wykonywania uruchomionego polecenia. Więc się mylę?
Ctrl+D, po wpisaniu na początku linii na terminalu, oznacza koniec danych wejściowych. Nie jest to sygnał w sensie uniksowym: gdy aplikacja czyta z terminala, a użytkownik naciska Ctrl+D, aplikacja jest powiadamiana, że osiągnięto koniec pliku (tak jak w przypadku odczytu z pliku i przekazania ostatni bajt).
Ctrl+Cwysyła sygnał, SIGINT . Domyślnie SIGINT (sygnał przerwania) zabija aplikację pierwszoplanową, ale aplikacja może przechwycić sygnał i zareagować w inny sposób (na przykład sama powłoka przechwytuje sygnał i przerywa linię, którą zacząłeś pisać, ale nie „ t exit, wyświetla nowy monit i czeka na nowy wiersz poleceń).
Można zmienić znaki związane z EOF i SIGINT z sttypoleceniem, np stty eof astałaby aznak EOF, a stty intr ^-byłoby wyłączyć charakter SIGINT. Jest to rzadko przydatne.
Dzięki! Czy Ctrl+Doznacza Ctrl i wielką literę D, czy to nie ma znaczenia?
Tim
5
@Tim: potrzebujesz małych liter ... Konwencja pisania poleceń klawiaturowych wielkimi literami pojawia się, ponieważ etykiety na klawiaturze są zawsze pisane wielkimi literami, a opisywana jest KLUCZOWA SEKWENCJA, a nie rzeczywisty kod znaków widziany przez program. Tak, czasami jest to mylące.
Caleb
@Caleb: Dzięki! Jak określić, że klucz jest w kapitale? Czy może jest kiedykolwiek taki przypadek?
Tim
@Tim Na terminalu kombinacje klawiszy Ctrl+Shift+Di Ctrl+Dwysyłają ten sam znak (znak numer 4, zwykle nazywany Ctrl+D).
Gilles
2
@Tim Terminal otrzymał Ctrl + D. Nie wysyła znaku do programu. Co się dzieje, gdy program odczytuje z terminala, terminal mówi mu „to jest koniec pliku”, tak samo jak wtedy, gdy program próbuje czytać po zakończeniu pliku dyskowego. Powłoka w ogóle nie jest zaangażowana.
Gilles,
23
Twój drugi punkt łączy w sobie dwie zupełnie różne rzeczy.
Ctrl + C wysyła sygnał zabicia do uruchomionego procesu.
Potencjalne zamieszanie: z punktu widzenia aplikacji nie jest wysyłany żaden rzeczywisty znak dla ^ D. Co oznacza, że aplikacja nie odbiera tej postaci z read(2)wywołania systemowego.
Ctrl+D
oznacza Ctrl i wielką literę D, czy to nie ma znaczenia?Ctrl+Shift+D
iCtrl+D
wysyłają ten sam znak (znak numer 4, zwykle nazywanyCtrl+D
).Twój drugi punkt łączy w sobie dwie zupełnie różne rzeczy.
Szukasz tego drugiego.
źródło
read(2)
wywołania systemowego.