Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156406
  • 博文数量: 36
  • 博客积分: 802
  • 博客等级: 准尉
  • 技术积分: 717
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-02 22:47
文章分类
文章存档

2012年(36)

分类: LINUX

2012-08-20 17:57:21

这是根据setjmp/longjmp,sigaction signal,sigqueue函数写的一个对信号这章的大体程序:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<unistd.h>
  4. #include<setjmp.h>
  5. #include<signal.h>
  6. #include<string.h>

  7. jmp_buf buf;

  8. void handler_sigint1(int signo)
  9. {
  10.     printf("recv SIGINT\n");
  11.     longjmp(buf,1);
  12. }
  13. void handler_sigint2(int signum,siginfo_t *info,void *myact)
  14. {
  15.     int i;
  16.     for(i=0;i<5;i++)
  17.         printf("%d\n",*((int *)(info->si_value.sival_ptr)+i));
  18.     printf("handle signal %d over\n",signum);
  19.     longjmp(buf,2);
  20. }
  21. int main(int argc,char **argv)
  22. {
  23.     struct    sigaction act;
  24.     union sigval mysigval;
  25.     int i;
  26.     int sig;
  27.     pid_t pid;
  28.     int data[10];
  29.     memset(data,0,sizeof(data));
  30.     for(i=0;i<5;i++)
  31.         data[i]=2;
  32.     mysigval.sival_ptr=data;
  33. //    sig=atoi(argv[1]);
  34.     pid=getpid();
  35.     sigemptyset(&act.sa_mask);
  36.     
  37.     switch(setjmp(buf))
  38.     {
  39.         case 0:
  40.             break;
  41.         case 1:
  42.              printf("return from handler_sigint1\n");
  43.              break;
  44.         case 2:
  45.              printf("wait for handler_sigint2\n");
  46.                 break;
  47.         default:
  48.              break;
  49.     }
  50.     sig=2;
  51.     signal(SIGINT,handler_sigint1);
  52.     raise(sig);
  53.     act.sa_sigaction=handler_sigint2;
  54.     act.sa_flags=SA_SIGINFO;
  55.     sigaction(SIGRTMIN+15,&act,NULL);
  56.     sig=49;
  57.     sigqueue(pid,sig,mysigval);


  58.     while(1);



  59.     return 0;
  60. }
阅读(1267) | 评论(0) | 转发(0) |
0

上一篇:数组和指针

下一篇:关于内存

给主人留下些什么吧!~~