免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2388 | 回复: 4
打印 上一主题 下一主题

apue 信号章节的第六道习题,不能捕获sigusr1信号 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-02 17:51 |只看该作者 |倒序浏览
习题是:用信号实现父子进程同步.
为何子进程向父进程发送SIGUSER1信号后, 程序直接退出,而不能捕获呢?
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6. #include <signal.h>
  7. #include "err.h"
  8. void TELL_WAIT();
  9. void TELL_PARENT();
  10. void WAIT_PARENT();
  11. void TELL_CHILD();
  12. void WAIT_CHILD();
  13. void sig_usr(int);
  14. static volatile sig_atomic_t sigflag=0;
  15. static sigset_t newmask,oldmask,zeromask;
  16. int main(void)
  17. {
  18.         FILE *fp;
  19.          pid_t pid;
  20.         char count='1';
  21.         if((fp=fopen("/home/xiao/apue/test.txt","a+"))==NULL)
  22.                 err_sys("fopen err");
  23.         if(fclose(fp)==-1)
  24.                 err_sys("close err");
  25.         if(pid=fork()==-1)
  26.                 err_sys("fork err");
  27.        TELL_WAIT();
  28.         else if(pid==0){
  29.                
  30.                 printf("i'm child:");
  31.                 fputc(count,fp);
  32.                 printf("\n");
  33.                 count++;
  34.                 printf("parent pid is %d\n",getppid());
  35.                 TELL_PARENT(getppid());   --用gdb调试到这边时,程序直接退出.信号SIGUSER1不能捕获
  36.                 WAIT_PARENT();
  37.                 exit(0);
  38.         }
  39.         printf("my pid is %d\n",getpid());
  40.         WAIT_CHILD();
  41.         printf("i'm PARENT:");
  42.         fputc(count,fp);
  43.         printf("\n");
  44.         fflush(fp);
  45.         TELL_CHILD(pid);
  46.         exit(0);
  47. }
  48. void sig_usr(int signo){     --这个信号处理程序不能被执行
  49.         sigflag=1;
  50.         return;
  51. }
  52. void TELL_WAIT(void)
  53. {
  54.         if(signal(SIGUSR1,sig_usr)==SIG_ERR)
  55.                 err_sys("signal(SIGUSR1) eror");
  56.         if(signal(SIGUSR2,sig_usr)==SIG_ERR)
  57.                 err_sys("signal(SIGUSR2) error");
  58.         sigemptyset(&newmask);
  59.         sigemptyset(&zeromask);
  60.         sigaddset(&newmask,SIGUSR1);
  61.         sigaddset(&newmask,SIGUSR2);
  62.         if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)
  63.                 err_sys("SIG_BLOCK error");
  64. }
  65. void TELL_PARENT(pid_t pid)
  66. {
  67.         kill(pid,SIGUSR2);
  68. }
  69. void WAIT_PARENT(void)
  70. {
  71.         while(sigflag==0)
  72.                 sigsuspend(&zeromask);
  73.         sigflag=0;
  74.         if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
  75.                 err_sys("SIG_SETMASK error");
  76. }
  77. void TELL_CHILD(pid_t pid)
  78. {
  79.         kill(pid,SIGUSR1);
  80. }
  81. void WAIT_CHILD(void)
  82. {
  83.         while(sigflag==0)
  84.                 sigsuspend(&zeromask);
  85.         sigflag=0;
  86.         if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
  87.                 err_sys("SIG_SETMASK error");
  88. }
复制代码

[ 本帖最后由 打靶归来 于 2008-6-2 17:52 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-06-02 18:01 |只看该作者
继续找问题,不可能抓不到SIGUSR,是你没写对

论坛徽章:
0
3 [报告]
发表于 2008-06-02 20:34 |只看该作者
原帖由 打靶归来 于 2008-6-2 17:51 发表
习题是:用信号实现父子进程同步.
为何子进程向父进程发送SIGUSER1信号后, 程序直接退出,而不能捕获呢?
     . . . . . .
        if(fclose(fp)==-1)
                err_sys("close err");
       if(pid=fork()==-1)
                err_sys("fork err");
       TELL_WAIT();
    . . . . . .

运算符的优先级没处理好。

论坛徽章:
0
4 [报告]
发表于 2008-06-03 09:23 |只看该作者
原帖由 zwylinux 于 2008-6-2 20:34 发表

运算符的优先级没处理好。

昏呀,
我发现我经常犯这种错误....

论坛徽章:
0
5 [报告]
发表于 2008-06-03 09:25 |只看该作者
原帖由 打靶归来 于 2008-6-3 09:23 发表

昏呀,
我发现我经常犯这种错误....


没有克服不了的错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP