pborawski

Sygnaly cz.3

Oct 15th, 2012
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.93 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. /* przy czwartej probie wylaczenie zmienia tryb na SIGHUP */
  22.  if(ctrl_c_count == 3)
  23.  {
  24.     kill(getpid(), SIGHUP);
  25.  }
  26.  ctrl_c_count++;
  27.  
  28. /* przywróæ star± maske sygna³u */
  29.  sigprocmask(SIG_SETMASK, &old_set, NULL);
  30. }
  31.  
  32. /* Funkcja uchwytu sygna³u Ctrl+Z */
  33. void catch_suspend(int sig_num)
  34. {
  35.  sigset_t mask_set;  /* u¿ywane do ustawiania grupy maski sygna³u */
  36.  sigset_t old_set;     /* u¿ywane do przechowywania starej maski */
  37. /* ponowne ustawienie uchwytu do sygna³u, w celu z³apania go nastepnym razem */
  38.  signal(SIGTSTP, catch_suspend);
  39. /* maskuj wszystkie kolejne sygna³y dopoki jestesmy w funkcji uchwytu */
  40.  sigfillset(&mask_set);
  41.  sigprocmask(SIG_SETMASK, &mask_set, &old_set);
  42. /* wypisz aktualn± warto¶æ licznika Ctrl+C */
  43.  printf("\n\nDotychczas naliczylem '%d' wcisniec klawiszy Ctrl+C\n\n", ctrl_c_count);
  44.  ctrl_c_count++;
  45.  fflush(stdout);
  46. /* przywróæ star± maske sygna³u */
  47.  sigprocmask(SIG_SETMASK, &old_set, NULL);
  48. }
  49.  
  50.  
  51. int main(int argc, char* argv[])
  52. {
  53. /* Gdzieś w funkcji main...
  54. ustaw uchwyty sygnałów Ctrl+C oraz Ctrl+Z */
  55. signal(SIGINT, catch_int);
  56. signal(SIGTSTP, catch_suspend);
  57. /* i dalsza część programu */
  58.  
  59.     for ( ;; )
  60.     pause();
  61.  
  62.     return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment