首 页 » 程序开发 » Unix移植到windows的信号处理

Unix移植到windows的信号处理

[ 2010-08-01 20:22 | 浏览次数: 1,292次 | 0条评论 ]

在Unix下信号处理类似于注册一个事件(与一个函数捆绑),当事件发生时,调用所捆绑的函数。
如:
   signal(SIGQUIT,Catch_Signal);
当SIGQUIT事件发生时调用Catch_Signal函数处理。
在Windows上也有这个函数,可以使用。
但是有一点有很大差别。
Unix在事件发生时是从当前代码直接跳过去运行事件函数。
Windows是起一个线程来调用事件函数。
区别:
: 主线程会暂停
:主线程不会暂停

所以移植时需注意:
以下是一个移植的例子

 BOOL WINAPI CtrlHandler( DWORD dwType );

  HANDLE g_MainThread;  // main thread

  BOOL WINAPI CtrlHandler( DWORD dwType ) ; //handle  event

int main()

{

HANDLE cp;

HANDLE ct;

BOOL bCtrlHand;

//get main thread handle

   cp = GetCurrentProcess();

   ct = GetCurrentThread();

//拿到真实的主线程句柄

   if(DuplicateHandle(cp, ct, cp, &g_MainThread, 0, TRUE, DUPLICATE_SAME_ACCESS) == 0)

   {

       exitcode = EXIT_ORTHER;

       exit(exitcode);

   }

//注册Ctrl相关的事件

bCtrlHand = SetConsoleCtrlHandler(CtrlHandler, TRUE ); 

  if ( !bCtrlHand ) {

   exitcode = EXIT_ORTHER;

   exit(exitcode);

   }

}

//ctrl相关事件处理

BOOL WINAPI CtrlHandler( DWORD dwType )

    {

        BOOL    flg;

        flg = FALSE;

//暂停主线程

SuspendThread(g_MainThread);

        switch ( dwType ) {

            case CTRL_C_EVENT :         /* CTRL+C     */

     case CTRL_BREAK_EVENT :     /* CTRL+BREAK    */

case CTRL_CLOSE_EVENT :     /* 强制关闭     */  

         case CTRL_SHUTDOWN_EVENT :  /* Windows 关闭*/

                   case CTRL_LOGOFF_EVENT :    /* Windows 注销     */ 

//添加关闭处,可以直接退出

//设置flag表示是否退出程序

           flg = FALSE;

                break;

        }

        return  (flg);

    }

您可以任意转载本文,但转载时请勿删除作者信息。
作者:hgyxbll,原文链接:http://shashanzhao.com/archives/386.html
上一篇: | 下一篇:

沙发为空,还不快枪?[点此发言]

目前还没有任何评论.