pborawski

Sygnaly cz.2

Oct 15th, 2012
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.36 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>          
  3. #include <unistd.h>        
  4. #include <sys/types.h>    
  5. #include <signal.h>        
  6.  
  7. /* Najpierw, zainicjujmy licznik Ctrl+C z początkowa wartością 0 */
  8. int ctrl_c_count = 0;
  9. #define CTRL_C_THRESHOLD 5
  10.  
  11. /* Funkcja uchwytu sygnału Ctrl+C */
  12. void catch_int(int sig_num)
  13. {
  14.  sigset_t mask_set;  /* używane do ustawiania grupy maski sygnału */
  15.  sigset_t old_set;     /* używane do przechowywania starej maski */
  16. /* ponowne ustawienie uchwytu do sygnału, w celu złapania go nastepnym razem */
  17.  signal(SIGINT, catch_int);
  18. /* maskuj wszystkie kolejne sygnały dopoki jestesmy w funkcji uchwytu */
  19.  sigfillset(&mask_set);
  20.  sigprocmask(SIG_SETMASK, &mask_set, &old_set);
  21. /* zwiêększ licznik i sprawdź czy próg został osiągnięty */
  22.  ctrl_c_count++;
  23.  if (ctrl_c_count >= CTRL_C_THRESHOLD) {
  24.     char answer[30];
  25. /* Spytaj użytkownika czy naprawde chce wyjśc czy nie */
  26.     printf("\nNaprawde chcesc juz wyjsc ? [t/N]: ");
  27.     fflush(stdout);
  28.     gets(answer);
  29.     if (answer[0] == 't' || answer[0] == 'T') {
  30.        printf("\nWychodze...\n");
  31.        fflush(stdout);
  32.        exit(0);
  33.     }
  34.     else {
  35.        printf("\nPracuje dalej...\n");
  36.        fflush(stdout);
  37. /* wyzerownaie licznika Ctrl + C */
  38.        ctrl_c_count = 0;
  39.     }
  40.  }
  41. /* przywróæ star± maske sygna³u */
  42.  sigprocmask(SIG_SETMASK, &old_set, NULL);
  43. }
  44.  
  45. /* Funkcja uchwytu sygna³u Ctrl+Z */
  46. void catch_suspend(int sig_num)
  47. {
  48.  sigset_t mask_set;  /* u¿ywane do ustawiania grupy maski sygna³u */
  49.  sigset_t old_set;     /* u¿ywane do przechowywania starej maski */
  50. /* ponowne ustawienie uchwytu do sygna³u, w celu z³apania go nastepnym razem */
  51.  signal(SIGTSTP, catch_suspend);
  52. /* maskuj wszystkie kolejne sygna³y dopoki jestesmy w funkcji uchwytu */
  53.  sigfillset(&mask_set);
  54.  sigprocmask(SIG_SETMASK, &mask_set, &old_set);
  55. /* wypisz aktualn± warto¶æ licznika Ctrl+C */
  56.  printf("\n\nDotychczas naliczylem '%d' wcisniec klawiszy Ctrl+C\n\n", ctrl_c_count);
  57.  ctrl_c_count++;
  58.  fflush(stdout);
  59. /* przywróæ star± maske sygna³u */
  60.  sigprocmask(SIG_SETMASK, &old_set, NULL);
  61. }
  62.  
  63.  
  64. int main(int argc, char* argv[])
  65. {
  66. /* Gdzieś w funkcji main...
  67. ustaw uchwyty sygnałów Ctrl+C oraz Ctrl+Z */
  68. signal(SIGINT, catch_int);
  69. signal(SIGTSTP, catch_suspend);
  70. /* i dalsza część programu */
  71.  
  72.     for ( ;; )
  73.     pause();
  74.  
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment