歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Unix/Linux 信號處理示例程序

Unix/Linux 信號處理示例程序

日期:2017/3/1 10:56:24   编辑:Linux編程

1.簡單的信號處理程序

  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <signal.h>
  5. static void sig_usr(int);
  6. typedef void Sigfunc(int);
  7. Sigfunc *signal(int,Sigfunc *);
  8. int main(int argc,char **argv)
  9. {
  10. if(signal(SIGUSR1,sig_usr) == SIG_ERR){
  11. fprintf(stderr,"Error!\n");
  12. exit(-1);
  13. }
  14. if(signal(SIGUSR2,sig_usr) == SIG_ERR){
  15. fprintf(stderr,"Error!\n");
  16. exit(-1);
  17. }
  18. while(1)
  19. pause();
  20. }
  21. static void sig_usr(int signo)
  22. {
  23. if(signo == SIGUSR1)
  24. printf("received SIGUSR1!\n");
  25. if(signo == SIGUSR2)
  26. printf("received SIGUSR2!\n");
  27. else
  28. printf("received signal %d\n",signo);
  29. }

後台執行,.然後使用kill命令來發送信號。

  1. <strong>$ ./a.out &</strong>
  2. [1] 7216
  3. <strong>$ kill -USR1 7216
  4. </strong>received SIGUSR1
  5. <strong>$ kill -USR2 7216</strong>
  6. received SIGUSR2
  7. <strong>$ kill 7216
  8. </strong>[1]+ Terminated ./a.out

2.調用不可重入函數的示例程序

  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <signal.h>
  5. typedef void Sigfunc(int);
  6. Sigfunc *signal(int,Sigfunc *);
  7. static void my_alarm(int signo)
  8. {
  9. struct passwd *rootptr;
  10. printf("in signal handle\n");
  11. if((rootptr = getpwnam("root")) == NULL){
  12. printf("error!\n");
  13. exit(-1);
  14. }
  15. alarm(1);
  16. }
  17. int main(int argc,char **argv)
  18. {
  19. struct passwd *ptr;
  20. signal(SIGALRM,my_alarm);
  21. alarm(1);
  22. for(;;){
  23. if((ptr = getpwnam("leon")) == NULL)
  24. err_sys("getpwnam error");
  25. if(strcmp(ptr->pw_name,"leon") != 0)
  26. printf("return value corrupted!,pw_name = %s\n",ptr->pw_name);
  27. }
  28. }
Copyright © Linux教程網 All Rights Reserved