bartolomeo_1 Opublikowano 19 Maja 2004 Zgłoś Opublikowano 19 Maja 2004 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
cinek Opublikowano 19 Maja 2004 Zgłoś Opublikowano 19 Maja 2004 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
bartolomeo_1 Opublikowano 19 Maja 2004 Zgłoś Opublikowano 19 Maja 2004 Ciepło, ciepło. Dzięki wielkie! Bardzo dobry trop :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
cinek Opublikowano 19 Maja 2004 Zgłoś Opublikowano 19 Maja 2004 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/ Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...