信号为什么只处理一次

发布于 2022-07-21 17:09:18 字数 762 浏览 19 评论 6

我的信号处理函数是这样的

  1. void sig_handle(int signum,siginfo_t *info,void *myact)
  2. {
  3. static int a=0;
  4. char *sh_addr;
  5. int shmid,i;
  6. struct blaster_data_pack bls_dat;
  7. struct sigaction act;
  8. act.sa_flags=SA_SIGINFO;
  9. act.sa_sigaction=sig_handle;
  10. if(sigaction(SIGUSR1,&act,NULL)<0){
  11.    printf("install sigal errorn");
  12. }
  13. dbg("sigusr1_handlen");}

复制代码
每次收到信号后又重新安装信号。第一次信号安装是在其他函数,安装方式和这个一样。
但是在发信号时,只有第一次才会去处理,接下来就不会进入到信号处理函数里.为什么呢?如果不在处理信号时安装信号处理函数,也是只有第一次会去处理信号。

我发送信号的程序是:

  1. ppid=getppid();
  2. sigqueue(ppid,SIGUSR1,my_sigval);

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

送君千里 2022-07-26 14:17:59

主进程,信号接收端的代码

  1. void sig_handle(int signum,siginfo_t *info,void *myact);
  2. struct sigaction *act_old;
  3. pid_t ir_learn_pid;
  4. start_learn_key()
  5. {
  6. struct sigaction act;
  7. act_old=(struct sigaction*)malloc(sizeof(struct sigaction));
  8. act.sa_flags=SA_SIGINFO;
  9. act.sa_sigaction=sig_handle;
  10. if(sigaction(SIGUSR1,&act,act_old)<0){
  11.    printf("install sigal errorn");
  12. }
  13. ir_learn_pid=learn_ir_key();
  14. if(ir_learn_pid<0){
  15.    printf("err returnn");
  16.    return;
  17. }
  18. }
  19. void sig_handle(int signum,siginfo_t *info,void *myact)
  20. {
  21. static int a=0;
  22. char *sh_addr;
  23. int shmid,i;
  24. struct blaster_data_pack bls_dat;
  25. struct sigaction act;
  26. act.sa_flags=SA_SIGINFO;
  27. act.sa_sigaction=sig_handle;
  28. if(sigaction(SIGUSR1,&act,NULL)<0){
  29.    printf("install sigal errorn");
  30. }
  31. dbg("sigusr1_handlen");
  32. if(ir_learn_pid!=(info->si_value.sival_int>>16)){
  33.    dbg("ir_learn_pid=%d,info->si_value.sival_int>>16=%dn",ir_learn_pid,(info->si_value.sival_int>>16));
  34.    return;
  35. }
  36. shmid=info->si_value.sival_int&0xFFFF;
  37. dbg("receive from ir_learningn");
  38. if((sh_addr=(char*)shmat(shmid,0,0))<0){
  39.        printf("shmat error!n");
  40.        return;  
  41. }
  42. dbg("shmat okn");
  43. for(i=0;i<sizeof(struct blaster_data_pack);i++){
  44.        *(char *)(&bls_dat+i)=*(sh_addr+i);
  45. }
  46. printf("bls_dat.bitstimes=%xn",bls_dat.bitstimes);
  47.         printf("bls_dat.bit0=%dn",bls_dat.bit0);
  48.         printf("bls_dat.bit1=%dn",bls_dat.bit1);
  49.         printf("bls_dat.bit2=%dn",bls_dat.bit2);
  50.         for(i=0;i<10;i++)
  51.           printf("bls_dat.specbits[%d]=%dn",i,bls_dat.specbits[i]);
  52.         for(i=0;i<9;i++){
  53.           printf("bls_dat.mbits[%d]=%xn",i,bls_dat.mbits[i]);
  54.           printf("bls_dat.dbits[%d]=%xn",i,bls_dat.dbits[i]);
  55.         }
  56. a++;
  57. if(a==3){
  58.        *sh_addr=0;
  59.        *(sh_addr+1)='a';
  60.        *(sh_addr+2)='';
  61.        sigaction(SIGUSR1,act_old,NULL);
  62.        free(act_old);   
  63. }
  64. //kill(ir_learn_pid,SIGCONT);
  65. dbg("send SIGCONTn");
  66. if(shmdt(sh_addr)<0){
  67.        printf("shmdt error!n");
  68. }   
  69. }

复制代码

发送信号端的代码

  1. int learn_ir_key()
  2. {
  3.   dbg("learn_ir_keyn");
  4.   pid_t new_pid;
  5.   if((new_pid=fork())>0){
  6.     dbg("new_pid=%d,pid=%dn",new_pid,getpid());
  7.     return new_pid;
  8.   }
  9.   else if(!new_pid){
  10.     dbg("new proccessn");
  11.     int shmid;
  12.     int fd = 0,i,j;
  13.     pid_t pid,ppid;
  14.     union sigval my_sigval;
  15.     struct blaster_data_pack bls_dat[3];
  16.     char *sh_addr;
  17.     char sh_dat,key_name[30];
  18.     dbg("shmgetn");
  19.     shmid=shmget(100,sizeof(struct blaster_data_pack),IPC_CREAT|438);
  20.     sh_addr=(char*)shmat(shmid,0,0);
  21.     if((int)sh_addr==-1){
  22.        printf("shmat error!n");
  23.        goto out;  
  24.     }
  25.     dbg("open irrtcn");
  26.     fd = open(IRRTC_DEV, O_RDWR);
  27.     if (fd < 0)
  28.     {
  29.         printf("ERROR: opening %sn", IRRTC_DEV);
  30.         goto out;
  31.     }
  32.     pid=getpid();
  33.     ppid=getppid();
  34.     dbg("shmid=%xn",shmid);
  35.     my_sigval.sival_int=pid;
  36.     my_sigval.sival_int<<=16;
  37.     my_sigval.sival_int|=shmid;
  38.     //sigaction(SIGCONT,NULL,NULL);
  39.      dbg("send signal ppid=%dn",ppid);
  40.     for(i=0;i<3;i++){
  41.      if((i=sigqueue(ppid,SIGUSR1,my_sigval))!=0)
  42.       printf("sigqueue(ppid,SIGUSR1,my_sigval)=%dn",i);
  43.     sleep(1);
  44.     }
  45.     dbg("3 times capture completen");
  46.     close(fd);
  47.     sh_dat=0;//*sh_addr;
  48.     for(i=0;i<30;i++){
  49.        key_name[i]=*(sh_addr+i+1);
  50.     }
  51.     if(shmdt(sh_addr)<0){
  52.        printf("shmdt error!n");
  53.     }   
  54.    
  55.     dbg("outn");
  56. out:
  57.     exit(0);
  58.     }
  59.   else{
  60.     printf("creat proccess errorn");
  61.     return(-1);
  62.   }
  63.    
  64. }

复制代码

好久不见√ 2022-07-26 13:50:35

把代码贴全,这样看不到问题

我的黑色迷你裙 2022-07-26 13:28:44

那是什么原因导致这个问题呢,帮我分析一下

终难愈 2022-07-26 09:38:04

原帖由 richardhesidu 于 2006-8-14 19:19 发表

这是在栈上分配的。子函数退出以后还找得到吗?

信号注册成功后就不需要这个变量了,所以,无所谓是否局部变量

一指流沙 2022-07-26 05:34:16

原帖由 john3851 于 2006-8-14 11:06 发表
struct sigaction act;

这是在栈上分配的。子函数退出以后还找得到吗?

╰沐子 2022-07-25 12:21:03

sigqueue的返回值是多少?别的SIGNAL也是如此么?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文