Skocz do zawartości
bartolomeo_1

signal.h i kłopoty z własnymi sygnałami

Rekomendowane odpowiedzi

W bibliotece signal.h zdefiniowanych jest kilkadziesiąt sygnałów. Są wygodne w użyciu i generalnie mają swoje plusy. Nie mogę jednak nic znaleźć na temat zmiany standardowej kombinacji klawiszy wywołującej sygnał z poziomu aplikacji.

 

Konkretnie: Jak wywołać SIGINT nie przez CTRL+c, tylko na przykład CTRL+k, ewentualnie jak wywołać SIGUSR1 przez na przykład CTRL+1?

 

Będę wdzięczyny za odpowiedz :)

 

p.s. Zastanawiałem się, czy bardziej odpowiednim działem nie będzie "Programowanie", ale signal.h jest bezpośrednio związany z UNIX więc pytanie zdecydowałem umieścić tu.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

witam, ja tam sie nie znam ale moze naprowadze na trop:

ja np. aby podlozyc pod inna kombinacje klawiszy wywolanie SIGINT uruchamialem przed wlasciwym programem:

stty intr ^X (podkladalo SIGINT pod ctrl+x zamiast ctrl+c)

Musialbys pogrzebac sobie w zrodlach tego programiku zwracajac uwage na funkcje set_control_char(), struktury control_info[], i w funkcji main na czesc po "if (require_set_attr)"

Tzn tak mi sie bynajmniej wydaje ;)

pozdr.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

hm, nie do konca automat ale moze Ci pomoc:

#include <stdio.h>#include <sys/types.h>#include <termios.h>#include <sys/ioctl.h>#include <getopt.h>#include <stdarg.h>#define VA_START(args, lastarg) va_start(args, lastarg)/* Control character settings.  */struct control_info {    const char *name;  /* Name given on command line.  */    unsigned char saneval;	/* Value to set for `stty sane'.  */    int offset; 	 /* Offset in c_cc.  */  };/* Control characters. */static struct control_info control_info[] ={  {"intr", CINTR, VINTR},  {"quit", CQUIT, VQUIT},  {"erase", CERASE, VERASE},  {"kill", CKILL, VKILL},  {"eof", CEOF, VEOF},  {"eol", CEOL, VEOL},  {"start", CSTART, VSTART},  {"stop", CSTOP, VSTOP},  {"susp", CSUSP, VSUSP},  /* These must be last because of the display routines. */  {"min", 1, VMIN},  {"time", 0, VTIME},  {NULL, 0, 0}};int main (void) {  struct termios mode;  struct control_info info;  char *key;  unsigned char value;  int fd=0;  const char *device_name="standard input";  memset (&mode, 0, sizeof (mode));  tcgetattr (fd, &mode);  key="^G";  info=control_info[0];    //intr//  xstrtol(key, NULL, 0, &value, "bB");  value=7;  printf("%s-%un",key,value);  mode.c_cc[info.offset] = value;  struct termios new_mode;  tcsetattr (fd, TCSADRAIN, &mode);  memset (&new_mode, 0, sizeof (new_mode));  tcgetattr (fd, &new_mode);  return 0;}

Po wyciagnieciu tego co potrzebujesz i dodaniu do swojego programu powinno chodzic. Podmiana value na podstawie (ctrl+ klawisz):

^Q-17 ^W-23 ^E-5 ^R-18 ^T-20 ^Y-25 ^U-21 ^I-9 ^O-15 ^P-16 ^A-1

^S-19 ^D-4 ^F-6 ^G-7 ^H-8 ^J-10 ^K-11 ^L-12 ^Z-26 ^X-24 ^C-3 ^V-22 ^B-2

^N-14 ^M-13 ^1-17 ^2-18 ^3-19 ^4-20 ^5-21 ^6-22 ^7-23 ^8-24 ^9-25 ^0-16

 

Wez pod uwage to, ze np. ctrl+m to odpowiednik entera, takze przy takiej podmianie enter staje sie bezuzyteczny ;)

Sorry za zabalaganiony kod ale nie posiadam wielkiej wiedzy na temat programowania, mam nadzieje ze to w czyms pomoze.

powodzenia ;)

 

PS.

fragmenty kodu tutaj: http://starogard.net.pl/~cinek/stty/

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...