⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recoverexcdemo.c

📁 Vxworks官方demo源代码 学习VXWORKS很好的资料
💻 C
字号:
/* recoverExcDemo.c - Demonstrates using signals to allow a task to recover                      gracefully from an exception                         *//*01b,05Sep95,ldt  fixed error in pipeDriver01a,02mar94,ms   modified for VxDemo */#include "vxWorks.h"#include "sigLib.h"#include "signal.h"#include "setjmp.h"#include "taskLib.h"#include "stdio.h"#include "fioLib.h"#include "ioLib.h"#include "pipeDrv.h"#define NULL_ADDR 0typedef struct    {    VOIDFUNCPTR routine;    int arg;    } MSG_REQUEST;#define TASK_PRI		254#define PIPE_NAME		"/pipe/server"#define NUM_MSGS                10/* setjmp buffer */LOCAL jmp_buf env;extern void i (int);STATUS recoverExcDemo ();/************************************************************** * sigHandler -- Returns task to known state. * *               Called when signal posted. * */void sigHandler      (     int sig,     /* signal number */     int code,    /* additional code */     SIGCONTEXT *sigContext /* context of task before siganl */     ){     switch (sig)     {         case SIGBUS:          printErr ("\nSignal SIGBUS (bus error) received\n");         break;         case SIGILL:          printErr ("\nSignal SIGILL received\n");         break;         case SIGSEGV:         printErr ("\nSignal SIGSEGV received\n");         break;}     longjmp (env, sig);     }/************************************************************** * */STATUS demo_raise (){    printf ("causing bus error\n");    /* Deliberately raise bus error */    (* (FUNCPTR) NULL_ADDR)();    return OK;}/************************************************************** * */STATUS demo_recover (){    int val = 0;    SIGVEC sig;    int setjmpReturnValue;    sig.sv_handler = (VOIDFUNCPTR) sigHandler;    sig.sv_mask = 0;    sig.sv_flags = 0;    val = 50;    printf ("demo_recover...\n");    setjmpReturnValue = setjmp (env);    if (setjmpReturnValue == 0)    {         /* direct invocation of setjmp */         /* install signal handler for each of the following signals */         sigvec (SIGBUS, &sig, NULL);         sigvec (SIGILL, &sig, NULL);         sigvec (SIGSEGV, &sig, NULL);         printf ("demo_recover...setup sigvec\n");    }    else    {        /* from a call to longjmp */              printf ("recover from signal %d. val = %d \n", setjmpReturnValue, val);        return OK;    }    /* raise the exception */    demo_raise ();    return OK;}STATUS recoverDemo (){    demo_recover ();    return OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -