当前位置:  技术问答>linux和unix

关于用采用单独的线程对信号进行处理的问题

    来源: 互联网  发布时间:2016-08-15

    本文导语:  代码: #include  #include  #include  #include  #include  int                         anaFlag = 0; //The flag of analysis sigset_t              mask; pthread_mutex_t   anaFlag_lock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t   ...

代码:
#include 
#include 
#include 
#include 
#include 

int                         anaFlag = 0; //The flag of analysis
sigset_t              mask;
pthread_mutex_t   anaFlag_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t      anaFlag_signal = PTHREAD_COND_INITIALIZER;

void *
sig_handler(void *arg)
{
int err, signo;
for (;;) {
err = sigwait(&mask, &signo);
if (err != 0)
err_exit(err, "sigwait failed");
switch (signo) {
case SIGUSR1:
pthread_mutex_lock(&anaFlag_lock);
anaFlag = 1;
pthread_mutex_unlock(&anaFlag_lock);
pthread_cond_signal(&anaFlag_signal);
break;
case SIGUSR2:
pthread_mutex_lock(&anaFlag_lock);
anaFlag = 0;
pthread_mutex_lock(&anaFlag_lock);
pthread_cond_signal(&anaFlag_signal);
break;
default:
err_sys("unexpected signal %dn", signo);
}
}
}

int
main(void)
{
        int  ret;
        pthread_t  signalTid;

        sigemptyset(&mask);
sigaddset(&mask, SIGUSR1);
sigaddset(&mask, SIGUSR2);
if ((ret = pthread_sigmask(SIG_BLOCK, &mask, NULL)) != 0)
err_exit(ret, "SIG_BLOCK error");
if ((ret = pthread_create(&signalTid, NULL, sig_handler, 0)) != 0)
err_exit(ret, "can't create thread");

        pthread_mutex_lock(&anaFlag_lock);
printf("befor analysis, wait signal, anaFlag=%dn", anaFlag);
while (anaFlag == 0)
pthread_cond_wait(&anaFlag_signal, &anaFlag_lock);
pthread_mutex_unlock(&anaFlag_lock);

        /* analyse something... */
        printf("analysis start, anaFlag=%dn",anaFlag);
        // analyse();

        pthread_mutex_lock(&anaFlag_lock);
while (anaFlag == 1){
pthread_cond_wait(&anaFlag_signal, &anaFlag_lock);
}
pthread_mutex_unlock(&anaFlag_lock);

        /* after analysis */
        printf("after analysis, wait signal, anaFlag=%dn",anaFlag);
        // stopAnalyse();

        /* deal with the result ... */
        
        exit(0);
}

程序想实现的功能是:当程序接收到SIGUSR1信号时,启动analysis过程,当收到SIGUSR2时,停止analysis过程。线程signalTid负责 处理 SIGUSR1 和 SIGUSR2 信号。
可程序的实际运行结果是:程序能接收到SIGUSR1信号,并启动analysis过程,能收到SIGUSR2信号,但主线程却停在“pthread_cond_wait(&anaFlag_signal, &anaFlag_lock);”,并不能收到sig_handler发过来的信号“pthread_cond_signal(&anaFlag_signal);”。

哪位大虾知道这是为什么啊?能否解答下,谢谢!!
        



|
代码太乱没心思看,你的目的用pthread_sigmask就可以实现,不想处理信号的线程block所有的信号,处理信号的线程不block信号就可以。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 消息队列一般是怎么使用的,是采用While的方式进行轮询么
  • 对于网络传输的数据,一般可以采用什么算法进行加密
  • 采用Jsp从数据库中取得数据,来生成XML文件,进行存储,应该如何做?
  • 协议的设计一般采用结构体进行数据打包,在协议设计的结构体中能不能使用指针 ?
  • 采用Linux/Unix作为服务器和采用windows系列有什么优缺点呢?
  • 作CRM现在使用什么开发工具比较方便?采用什么结构?
  • 采用Flash的嵌入式系统中是否难以应用数据库?
  • 请教有没有谁在 LINUX下实现对DVD光盘采用UDF格式刻录的?
  • 如果CSDN采用JSP技术,访问速度会不会加快
  • 请问应用服务器本身也是采用多层结构吗?疑惑中。
  • Solaris系统下,使用gcc编译程序,请问采用1字节对齐应该怎样设置
  • 在调用pthread_testcancel时要采用这样的方式???
  • YC2440开发板采用什么串口线?
  • 采用UDP对ARM系统远程监测
  • 一个可以自动排序、频繁增删的队列,采用哪种数据结构比较好?
  • 关于采用NT Loader引导redhat7.2的问题。
  • linux系统下,采用 ADSL 路由方式上网,如何设置网络端口interface的值?
  • 各位高手:servlet如何接收采用http上传(如同Email的附件)的文件?
  • linux 可以采用crypt来加密口令,不知道有什么解密方法没有?
  • 采用XML时候大家用DTD还是SCHEMA。
  • HP-UX 11.0 采用的是unix操作系统吗?
  • 怎么样去除浏览器中的滚动条,而采用内部的滚动条!
  • Primitive 与 String 之间的转换必须采用封装类吗?
  • .net/c#/asp.net iis7站长之家


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3