Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1247533
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: LINUX

2017-11-14 17:12:11


  1. #include <unistd.h>
  2. #include <sys/stat.h>
  3. #include <sys/wait.h>
  4. #include <sys/types.h>
  5. #include <fcntl.h>

  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <errno.h>
  9. #include <string.h>
  10. #include <signal.h>


  11. void handler(int sig,siginfo_t *s_t,void *p)//能够接受额外数据的信号处理函数签名
  12. {
  13.     int tmp = 0;
  14.     tmp = s_t->si_int; //si_int和si_value.sival_int是一样的--针对额外数据是int的时候。
  15.     printf("Aloha recv a sig=%d\t var :%d\n and var is also: %d \n", sig,tmp,s_t->si_value.sival_int);
  16. }


  17. int main(int argc, char *argv[])
  18. {
  19.     pid_t pid;
  20.     int ret = 0;
  21.     int i = 0;
  22.     union sigval mysigval;//用来存放额外数据
  23.     struct sigaction act;//用来注册信号

  24.      /*使用sigaction必须要初始化的三个成员*/
  25.     act.sa_sigaction = handler;//指定回调函数
  26.     act.sa_flags = SA_SIGINFO;//尤其重要--只有等于SA_SIGINFO,信号处理函数才能接受额外数据
  27.     sigemptyset(&act.sa_mask);//清空屏蔽字

  28.     if(sigaction(SIGUSR1,&act,NULL) < 0)//注册信号--指定毁掉函数
  29.     {
  30.         perror("sigaction error!\n");
  31.         exit(-1);
  32.     }

  33.     pid = fork();//创建子进程

  34.     if(-1 == pid)
  35.     {
  36.         perror("fork");
  37.         exit(-1);
  38.     }
  39.     else if(0 == pid)
  40.     {
  41.         mysigval.sival_int = 125;//设置要随着信号发送的额外数据
  42.         for(i = 0;i < 10;i++)//子进程发送十次信号--SIGINT是不可靠信号--传送有点慢
  43.         {
  44.             ret = sigqueue(getppid(),SIGUSR1,mysigval);//开始发送信号
  45.             if(ret != 0)//发送失败
  46.             {
  47.                 perror("sigqueue");
  48.                 exit(-1);
  49.             }
  50.             else
  51.             {//返回0表示信号发送成功
  52.                 printf("%d send ok! \n",i);
  53.                 sleep(1);
  54.             }
  55.         }
  56.     }
  57.     else if(pid > 0)
  58.     {
  59.         while(1);//父进程死循环
  60.     }

  61.     return 0;
  62. }

阅读(1877) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~