ACE 演练: 让程序响应ctrl+c信号

本文介绍如何使用ACE库使程序能够优雅地响应Ctrl+C信号并关闭。通过创建特定类和信号处理器,实现信号处理功能,确保程序在接收到中断信号时能够释放资源并终止。

本文发致Stone Jiang的博客以及www.ace-tao.org/bbs。 2008-10-21

转贴请注明。

让程序响应ctrl+c信号,并让程序优雅地关闭(后续演练将展示)非常必要。本文即给出如何让程序响应ctrl+c的示例。

从本文您可以学到:

1. 如何使用MPC工具生成项目工程文件;

2. 如何编写最简单的ACE程序;

本文适用于:

ACE菜鸟,并且能已经正确下载、安装ACE。

ACE高手请漂过。

过程:

1. 创建Quit目录,创建quit.mpc文件

2. 创建 main.cpp, 借用Exit_Signal_Handle类(Exit_Signal_Handle.h,cpp)

3. 编译,调试

1. quit.mpc如下

// file: quit.mpc

// author: stone jiang 2005119@gmail.com

// date: 2008-10-21

project (*) :aceexe {
exename = *
}

2. main.cpp如下

// -*- C++ -*-

//=============================================================================
/**
* @file Exit_Signal_Handler.cpp
*
* $Id$
*
* @author Stone Jiang (2005119@gmail.com)
*/
//=============================================================================

#include "ace/Log_Msg.h"
#include "ace/Sig_Handler.h"
#include "Exit_Signal_Handler.h"

int ACE_TMAIN(int, ACE_TCHAR *[])
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("Starting.....\n")));
ACE_Thread_Semaphore lock (0);

Exit_Signal_Handler exit_handler (lock);
ACE_Sig_Handler sig_handler;
sig_handler.register_handler (SIGINT, &exit_handler);

ACE_Guard <ace_thread_semaphore> guard (lock); <br> ACE_DEBUG((LM_DEBUG,ACE_TEXT("Terminate.....\n"))); <br> return 0; <br>}</ace_thread_semaphore>

3. Exit_Signal_Handle类的实现如下

// -*- C++ -*-

//=============================================================================
/**
* @file Exit_Signal_Handler.h
*
* $Id$
*
* @author Friedhelm Wolf (fwolf@dre.vanderbilt.edu)
*/
//=============================================================================

#ifndef _EXIT_SIGNAL_HANDLER_H_
#define _EXIT_SIGNAL_HANDLER_H_

#include <ace><br>#include <ace></ace></ace>

/**
* @class Exit_Signal_Handler
*
* @brief this class handles the kill signal for this application in a nice
* way, releasing a semaphore.
*/
class Exit_Signal_Handler : public ACE_Event_Handler
{
public:

/// ctor
Exit_Signal_Handler (ACE_Thread_Semaphore & lock);

/// dtor
virtual ~Exit_Signal_Handler ();

/// Called when object is signaled by OS (either via UNIX signals or
/// when a Win32 object becomes signaled).
virtual int handle_signal (int signum, siginfo_t *, ucontext_t *);

private:
ACE_Thread_Semaphore & lock_;
};

#endif /* _EXIT_SIGNAL_HANDLER_H_ */

// -*- C++ -*-

//=============================================================================
/**
* @file Exit_Signal_Handler.cpp
*
* $Id$
*
* @author Friedhelm Wolf (fwolf@dre.vanderbilt.edu)
*/
//=============================================================================

#include <iostream><br>#include "Exit_Signal_Handler.h" </iostream>

Exit_Signal_Handler::Exit_Signal_Handler (ACE_Thread_Semaphore & lock)
: lock_ (lock)
{
}

Exit_Signal_Handler::~Exit_Signal_Handler ()
{
}

int
Exit_Signal_Handler::handle_signal (int , siginfo_t *, ucontext_t *)
{
return lock_.release ();
}

4. 生成工程文档

以Viusal studio 2008为例

如果是linux, vc9改为gnuace,如果是Visual Stuido 2003,2005,改为vc71,vc8

> mwc.pl -type vc9

image

mpc工具为我们生成了Quit.sln

5. 编译

用Viusal Stuido 2008打开Quit.sln (由上一步生成所得),编译。

也可从命令行编译之

>devenv Quit.sln /Build Debug
image

6.运行,查看结果

image

运行后,屏幕显示

Starting.....

程序阻塞于此,按下ctrl+c组合键后,显示

Terminate.....

程序正常关闭。

需要完整源代码请在www.ace-tao.org/bbs留言或发邮件给我索要。

Stone Jiang.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值