免费注册 查看新帖 |

Chinaunix

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

多线程中,(实时)信号由谁接收? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-14 15:30 |只看该作者 |倒序浏览
在main中启动一个线程,这个子线程代码如下:
  1. void * thread(void * arg)
  2. {
  3. //安装一个SIGINT信号处理
  4.      struct sigaction st;
  5.         sigemptyset(&st.sa_mask);
  6.         st.sa_flags = SA_SIGINFO;
  7.         st.sa_handler = 某个处理函数(在处理函数中打印线程id);
  8.         sigaction(SIGINT, &st, NULL);

  9.        int ret ;
  10.        while ( 1 )
  11.       {
  12.            ret = sleep(10);
  13.            assert(ret==0);//sleep没有被打断
  14.      }
  15. }
复制代码
程序运行后,ctrl+C,会发现捕捉信号的永远是main,子线程一直循环睡眠。请问是为什么呢?

论坛徽章:
0
2 [报告]
发表于 2010-02-16 21:59 |只看该作者
有熟悉内核的朋友讲讲发信号给线程的规则吗?

论坛徽章:
0
3 [报告]
发表于 2010-02-16 22:23 |只看该作者
好像有个会话首进程,也就是那个进程,才跟终端有联系?
具体也不知道,应该跟终端相关的有关

论坛徽章:
0
4 [报告]
发表于 2010-03-17 10:25 |只看该作者
#include <signal.h>
#include <pthread.h>  
#include <stdio.h>
  void intr(int sig,siginfo_t *info,void *context)
  {
          printf("caught by %d\n",pthread_self());
  }
  
  
  
    void * thread(void * arg)
    {
    //安装一个SIGINT信号处理
   
         struct sigaction st;
            sigemptyset(&st.sa_mask);
            st.sa_flags = SA_SIGINFO;
            st.sa_handler = intr;
            sigaction(SIGINT, &st, NULL);
                                  

          int ret ;
          while ( 1 )
         {
              ret = sleep(10);
              if(ret)
                      printf("interrupted\n");
              
        }
   }
   
   main()
   {
           pthread_t tid;
           sigset_t    mask,oldmask;
                setbuf(stdout,0);
           printf("parent is %d\n",pthread_self());
           pthread_create(&tid,0,thread,0);
    sigemptyset(&mask);
    sigaddset(&mask, SIGINT);
    if (pthread_sigmask(SIG_BLOCK, &mask, &oldmask))
        printf("SIG_BLOCK error\n");

    sleep(200)    ;
  }


请注意红色代码,要在主线程里面阻塞sigint,这样ctrl+c就会把信号发给子线程了

论坛徽章:
0
5 [报告]
发表于 2010-03-17 12:42 |只看该作者
每个线程都有自己独立的信号屏蔽字,但是信号处理函数是进程中所有线程共享的。

信号被发送到进程后,进程中当前没有阻塞该信号的某个线程被选中,接受信号。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP