logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak obsłużyć klawisze DEL, HOME, END w C na Linuxie bez przerywania programu?

one_eddie 28 Lis 2005 00:21 1907 6
REKLAMA
  • #1 2032945
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    W jaki sposob mozna obsluzyc w programie (konsola linux), znaki: DEL, HOME, END, LEFT, RIGHT, itp?

    Standardowo podczas nacisniecia w/w klawiszy, wywolywany jest SINT i program jest przerywany.
  • REKLAMA
  • #2 2051422
    Caladan
    Poziom 19  
    Posty: 242
    Pomógł: 33
    Ocena: 3
    a getchar nie dziala? O ile dobrze pamietam, to ogolnie dla takich znakow wpierw jest wysylany kod znaku 0, a dopiero drugi odebrany bajt inormuje o faktycznie odebranym znaku. Poza tym nie rozumiem, co to SINT... Nie spotkalem sie z czyms takim... Mozesz wyjasnic?
  • REKLAMA
  • #3 2051488
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    Caladan napisał:
    a getchar nie dziala? O ile dobrze pamietam, to ogolnie dla takich znakow wpierw jest wysylany kod znaku 0, a dopiero drugi odebrany bajt inormuje o faktycznie odebranym znaku. Poza tym nie rozumiem, co to SINT... Nie spotkalem sie z czyms takim... Mozesz wyjasnic?


    SINT = signal interupt
    Jesli chodzo o to co napisales (1 kod zero potem dane) to prawda, ale na platformie win32.

    Skompiluj prosty przyklad na jakims linuchu i zobacz czy obsluzy ci w/w klawisze.

    int main( void )
    {
       int k;
       while ( (k = getchar()) != 'q' )
          printf( "dec = %d\n", k );
       return 0;
    }
  • REKLAMA
  • #4 2052056
    Sam Sung
    Poziom 33  
    Posty: 2032
    Pomógł: 227
    Ocena: 605
    Z generowaniem SIGINT podczas naciskania klawisza jeszcze się nie spotkałem - no chyba, że CTRL-C :)
    Masz chyba 2 wyjścia:
    - pozyskać kody sekwencji klawiszy i potem je rozpoznawać
    - użyć biblioteki ncurses (zobacz man curs_getch)
    Ewentualnie 3. wyjście - poszukać innej biblioteki (może Slang?)
  • REKLAMA
  • #5 2052612
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    Sam Sung napisał:
    Z generowaniem SIGINT podczas naciskania klawisza jeszcze się nie spotkałem - no chyba, że CTRL-C :)
    Masz chyba 2 wyjścia:
    - pozyskać kody sekwencji klawiszy i potem je rozpoznawać
    - użyć biblioteki ncurses (zobacz man curs_getch)
    Ewentualnie 3. wyjście - poszukać innej biblioteki (może Slang?)


    Nie chce uzywac bib. curses.
    Jesli chodzi o pozyskanie sekwencji to nie mam pojecia jak to zrobic, po nacisnieciu klawisza program jest przerywany wiec nie mam mozliwosci pobrania tej sekwencji. Gdybys mogl podac jakis przyklad bede wdzieczny.

    // ...
    Problem juz rozwiazany, dziekuje wszystkim za pomoc...
    Problem polegal na tym ze program czekal na klawisz ESC zeby zakonczyc dzialanie a sekwencje specialne zaczynaly sie wlasnie od tego znaku.
  • #6 2066889
    ozzon
    Poziom 15  
    Posty: 116
    Pomógł: 10
    Ocena: 9
    Przyjrzyj się opisom struktury struct termios.
    Zawiera ona pola definiujące zachowanie się terminali w Linuxie, jest tam też coś o konwersji znaków specjalnych, choć CTRL+C musisz przechwycić.

    Miałem kiedyś link do manuali, jak znajdę to wstawię, ale możesz też użyć googli
  • #7 2068508
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    Problem zglebilem wystarczajaco.
    Czytalem manuale, przeszukalem google.

    Wszystko juz dziala, wiec nie widze powodu aby poruszac ten temat.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem obsługi klawiszy specjalnych takich jak DEL, HOME, END, LEFT, RIGHT w programie konsolowym napisanym w C na systemie Linux, bez przerywania działania programu przez sygnał przerwania (SIGINT). Standardowo naciśnięcie tych klawiszy nie generuje bezpośrednio SIGINT, wyjątkiem jest kombinacja CTRL-C. Klawisze specjalne wysyłają sekwencje znaków zaczynające się od znaku ESC, co może kolidować z prostą detekcją klawiszy. Propozycje rozwiązań obejmowały: ręczne pozyskanie i rozpoznanie sekwencji znaków wysyłanych przez terminal, użycie bibliotek takich jak ncurses (funkcja getch) lub Slang, a także konfigurację terminala za pomocą struktury termios, która pozwala na kontrolę zachowania terminala i obsługę znaków specjalnych. Ostatecznie problem został rozwiązany przez poprawne rozpoznanie sekwencji zaczynających się od ESC, co umożliwiło obsługę klawiszy bez przerywania programu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA