`

信号量处理类实现

    博客分类:
  • ACE
阅读更多

 

signalhand.h
#include "ace/Basic_Types.h"
#include "ace/Signal.h"

/*************************************************
Class: CSignalHandlerImpl
Description: 信号量处理类实现
*************************************************/
class CSignalHandler : public ACE_Event_Handler
{
public:
    CSignalHandler();
    virtual ~CSignalHandler();

public:
    ACE_INT32 Init();//初始化
    ACE_INT32 Exit();

public:
    virtual ACE_INT32 handle_signal (ACE_INT32 signum, siginfo_t * = 0, ucontext_t * = 0); //实现这个回调函数

private:
    ACE_Sig_Action no_sigpipe;
};
 

 

分享到:
评论
1 楼 sblig 2010-12-20  
signalhand.cpp


/*************************************************
Function:         initial
Description:     初始化函数,进行信号量注册
*************************************************/
ACE_INT32 CSignalHandler::Init()
{
    CAppManager::Instance()->GetReactor().register_handler(SIGHUP, this);
    CAppManager::Instance()->GetReactor().register_handler(SIGINT, this);
    CAppManager::Instance()->GetReactor().register_handler(SIGABRT, this);
    CAppManager::Instance()->GetReactor().register_handler(SIGALRM, this);
    CAppManager::Instance()->GetReactor().register_handler(SIGUSR1, this);
    CAppManager::Instance()->GetReactor().register_handler(SIGUSR2, this);
#ifndef ACE_CONFIG_WIN32_H
    CAppManager::Instance()->GetReactor().register_handler(SIGPOLL, this);
    CAppManager::Instance()->GetReactor().register_handler(SIGVTALRM, this);
    CAppManager::Instance()->GetReactor().register_handler(SIGPROF, this);
#endif
    CAppManager::Instance()->GetReactor().register_handler(SIGCLD, this);
    CAppManager::Instance()->GetReactor().register_handler(SIGTERM, this);
    CAppManager::Instance()->GetReactor().register_handler(SIGCHLD, this);
    CAppManager::Instance()->GetReactor().register_handler(SIGIO, this);

    no_sigpipe.register_action (SIGPIPE, NULL);

    return 0;
}


/*************************************************
Function:         handle_signal
Description:     系统回调函数,这里不对信号量
                进行处理,只是进行标志位置位
                然后唤醒信号量处理线程进行处理
*************************************************/
ACE_INT32 CSignalHandler::handle_signal (ACE_INT32 signum, siginfo_t * , ucontext_t *)
{
    ACE_Sig_Set sigs;

    sigs.sig_add (SIGHUP);
    sigs.sig_add (SIGINT);
    sigs.sig_add (SIGABRT);
    sigs.sig_add (SIGALRM);
    sigs.sig_add (SIGUSR1);
    sigs.sig_add (SIGUSR2);
    sigs.sig_add (SIGCLD);
    sigs.sig_add (SIGTERM);
    sigs.sig_add (SIGCHLD);
    sigs.sig_add (SIGIO);

#ifndef ACE_CONFIG_WIN32_H
    sigs.sig_add (SIGPOLL);
    sigs.sig_add (SIGVTALRM);
    sigs.sig_add (SIGPROF);
#endif

    ACE_Sig_Guard guard (&sigs);

    if (SIGINT == signum || SIGTERM == signum)
    {
    	//会检测并退出系统的
    }
    else if (SIGUSR1 == signum)
    {
        // 自定义处理线程处理
    }

    return 0;
}

相关推荐

    操作系统实验-信号量机制实现进程同步

    信号量机制是实现进程同步的一种有效工具,由荷兰计算机科学家Dijkstra提出。信号量是一种特殊的变量,可以被多个进程共享,并通过P操作(wait)和V操作(signal)来控制对资源的访问。当一个进程访问某个资源时,会...

    LINUX 内核信号量设计与实现

    信号量的核心逻辑在于如何处理`down` 和 `up` 操作。 - **down**:减少信号量的计数器。如果计数器大于等于1,则进程可以继续执行;否则,将进程添加到等待队列中并挂起。 - **up**:增加信号量的计数器。如果...

    Vxworks的信号量机制实现任务同步

    信号量可以作为一种事件标志,一个任务或中断处理程序通过`semGive()`函数释放信号量来通知特定事件的发生,而其他任务则通过`semTake()`函数阻塞等待信号量被释放,从而实现任务间的同步执行。 ### 三、应用实例 ...

    Minix中实现信号量

    分析这个补丁可以帮助我们了解Minix中信号量的具体实现细节,包括如何在内核中定义信号量结构、如何进行信号量的P(wait)和V(signal)操作,以及如何处理阻塞和唤醒进程等。 herder.pdf 文件可能是关于Minix信号...

    LINUX内核信号量设计与实现.rar

    - 使用`down()` 和 `up()` 函数来降低和增加信号量的值,或者`down_interruptible()` 和 `up()` 用于处理中断情况。 3. **信号量的等待与唤醒**: - 当进程尝试获取资源但信号量不足时,会被放入等待队列。`down...

    数字信号处理及Matlab实现

    《数字信号处理及Matlab实现》是一本深入探讨数字信号处理理论与实践的书籍,它旨在帮助读者理解和应用这一领域的核心概念。通过结合Matlab这一强大的数学计算软件,作者为读者提供了一条从理论到实践的清晰路径。...

    数字信号处理原理及实现(王艳芬,王刚)答案.pdf

    总之,数字信号处理原理及实现系列教材旨在为电子信息类专业的本科生以及准备考研的学生提供一套完备的学习参考资料。通过理论讲解与实际应用相结合的方式,帮助读者深入理解数字信号处理的基本原理和方法,并提高其...

    c语言信号量的使用实例

    1. **头文件**:引入了处理信号量所需的头文件。 2. **定义**:定义了一个外部键`KEY`,这个键是用来标识信号量的唯一标识符。 3. **创建信号量**:使用`semget()`函数创建一个信号量。如果信号量不存在,则根据`KEY...

    以记录型信号量实现生产者-消费者问题

    以记录型信号量实现生产者-消费者问题 实验目的: 1.加深对进程同步概念的理解。 2.理解多道程序环境中,不同进程对资源访问及相互合作进程的关系的处理方法。 实验要求: 利用C语言程序模拟生产者-消费者问题和哲学...

    使用Qt信号量实现单生产者多消费者模型

    在Qt框架下,我们可以利用其强大的信号(Signals)和槽(Slots)机制,结合信号量(Semaphores)来实现单生产者多消费者模型,以确保线程间的同步和数据的安全传输。 首先,理解Qt的信号和槽机制是关键。信号...

    信号量YUV.zip_信号量处理

    在C语言中,信号量通常通过系统调用来实现,如`sem_open`, `sem_post`, `sem_wait`等。`semaphore.c`很可能是这个示例的主要源代码文件,它将演示如何在程序中创建、初始化、增加和减少信号量。`semaphore.h`可能...

    Linux 0.11下信号量的简单实现——用生产者消费者做检验

    3. `kernel/sched.c`:更新调度器以处理信号量等待的进程。 4. `kernel/proc.c`:修改进程管理代码,记录和恢复信号量状态。 5. `include/asm/semaphore.h`:针对特定体系结构的信号量实现。 6. 示例程序:展示如何...

    硬件信号量在多核处理器核间通信中的应用

    通过硬件信号量,多核处理器的每个核心能够高效地共享信息、执行任务并实现复杂的数据处理任务。随着多核技术的不断进步和应用领域的扩大,硬件信号量作为一种高效的核间通信机制,将会得到更广泛的应用。

    linux信号量详解

    在POSIX标准下,Linux提供了两种信号量实现方式:无名信号量和命名信号量。 - **无名信号量**主要用于同一进程内的线程间通信,它们共享相同的内存空间,因此无需额外的标识符。初始化无名信号量使用`sem_init`函数...

    使用信号量实现有限缓冲区的生产者和消费者问题

    总结来说,使用信号量实现有限缓冲区的生产者和消费者问题以及读进程具有优先权的读者和写者问题,关键在于正确地设计和操作信号量,确保并发进程的正确同步和互斥。在Linux下,C语言提供了丰富的接口支持信号量的...

    数字信号处理的FPGA实现(第3版)中文pdf及源码

    《数字信号处理的FPGA实现(第3版)》是一本深入探讨如何利用Field Programmable Gate Array(FPGA)技术实现数字信号处理算法的专业书籍。FPGA作为一种可编程逻辑器件,因其灵活性、高速度和低延迟特性,在数字信号...

    数字信号处理原理与实现(第2版)刘泉

    多率信号处理利用下采样和上采样来改变信号的采样率,可以有效减少计算量或提高分辨率。自适应滤波是一种根据输入信号的变化自动调整滤波器参数的方法,广泛应用于噪声抑制和信号分离。谱估计则是对信号功率谱密度的...

    数字信号处理的FPGA实现.pdf

    《数字信号处理的FPGA实现》是一本深入探讨如何利用Field Programmable Gate Array(FPGA)技术进行高效、灵活的数字信号处理的书籍。FPGA是集成电路领域的一种可编程器件,其灵活性使得它在数字信号处理领域有着...

Global site tag (gtag.js) - Google Analytics