Zatrzymywanie programu w konsoli za pomocą własnej kombinacji klawiszy

0

Witam,tak jak w tytule muszę stworzyć dowolną kombinacje klawiszy (inną niż CTRL+C,ALT+F4 itp) która zatrzyma program działający w konsoli.Znalazłem informacje o funkcjach getch() oraz kbhit() jednak wymagają one biblioteki conio.h która nie bardzo lubi się z linuxem.Zacząłem także kombinować coś z biblioteką ncurses.h jednak i tutaj daleko nie zaszedłem.Niżej przykład programu na którym taka kombinacja mogłaby być wykorzystana (pochodzi z ksiązki Advanced Linux Programming i wypisuje w pętli x oraz o ).Dziwi mnie że coś z pozoru tak łatwego jak zatrzymanie programu kombinacją klawiszy (czy nawet dowolnym jednym klawiszem) wymaga tyle zachodu,bo siedzę nad tym już 4 dzień i nie mogę rozgryźć.Powiedzmy ze chce zatrzymać program za pomocą q+w .Dzieki za wszelką pomoc

#include <pthread.h>
#include <stdio.h>

void * print_xs( void * unused )
{
    while( 1 )
         fputc( 'x', stderr );
    
    return NULL;
}

int main()
{
    pthread_t thread_id;
    
    
    pthread_create( & thread_id, NULL, & print_xs, NULL );
    
    while( 1 )
         fputc( 'o', stderr );
    
    return 0;
}
0

Zatrzymanie programu to wysłanie odpowiedniego sygnału (SIGINT).
Odczytanie klawiatury (w tle) to "zabawa" z przerwaniami. Tu masz jakiś przykład: https://www.tldp.org/LDP/lkmpg/2.4/html/x1210.html

1

Program ma działać pod Linuxem pod konsolą - więc chyba możnaby zrobić to na bazie przykładu:

stty -F tty intr ^E

Co to robi? Definiuje w driverze dyscypliny linii tty znak przerywający działanie programu. W tym przypadku będzie to ctrl-e.
Wpisz sobie to w konsoli i sprawdź czy to tak działa jak chciałeś - tzn. uruchom po tej komendzie jakiś program, który można przerwać standardowo przy pomocy ctrl-c i naciśnij ctrl-e.

Jeśli to jest to co chciałeś to pozostaje tylko kwestia zaimplementowania tego.

0

poczytaj jak w ncurses można obsługiwać klawiaturę.
To kiedy i jak ma się kończyć program to tylko kwestia logiki aplikacji, więc nie ma co za bardzo kombinować.
Wystarczy połączyć logikę aplikacji z odpowiednimi zdarzeniami klawiatury.

0

#include <windows.h>
if(GetAsyncKeyState(27))exit(0);

27 to ESC

i problem rozwiązany prawda? xD

0

Zobacz to (nie mogę otworzyć bo mi firewall blokuje):
http://www.gcat.org.uk/tech/?p=70

1 użytkowników online, w tym zalogowanych: 0, gości: 1