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

📄 rcs_exit.cc

📁 Source code for an Numeric Cmputer
💻 CC
字号:
/********************************************************************* Description: rcs_exit.cc*   This module provides a portable way to make sure multiple*   functions are called before exiting.*   These functions should be written to take an int  and return void.**   Derived from a work by Fred Proctor & Will Shackleford** Author:* License: LGPL Version 2* System: Linux*    * Copyright (c) 2004 All rights reserved.** Last change: * $Revision: 1.5 $* $Author: paul_c $* $Date: 2005/05/23 16:34:33 $********************************************************************//* Forward Function Prototypes */#include "rcs_exit.hh"#include "linklist.hh"		// LinkedList#include "rcs_print.hh"		// rcs_print_error()#include "timer.hh"		// esleep()#ifdef __cplusplusextern "C" {#endif#include <stdlib.h>		// exit()#include <signal.h>		// signal() , SIGINT#ifdef __cplusplus}#endifstatic LinkedList *exit_list = (LinkedList *) NULL;struct RCS_EXIT_LIST_ENTRY {    long process_id;    void (*fptr) (int);};// NOTE --// the GNU VxWorks C++ cross-compiler (g++68k) has a bug, that// prevents me from passing a pointer to a function as the first// argument of a function.int attach_rcs_exit_list(void (*fptr) (int)){    RCS_EXIT_LIST_ENTRY entry;    if (NULL == exit_list) {	exit_list = new LinkedList;    }    if (NULL == exit_list) {	rcs_print_error("attach_rcs_exit_list:: Out of Memory.\n");	return -1;    }    entry.process_id = 0;    entry.fptr = fptr;    return exit_list->store_at_tail(&entry, sizeof(entry), 1);}void rcs_cleanup(int code){    RCS_EXIT_LIST_ENTRY *entry;    long process_id = 0;    if (NULL == exit_list) {	return;    }    entry = (RCS_EXIT_LIST_ENTRY *) exit_list->get_head();    while (NULL != entry) {	if (entry->process_id == process_id && entry->fptr != NULL) {	    entry->fptr(code);	}	entry = (RCS_EXIT_LIST_ENTRY *) exit_list->get_next();    }    if (exit_list->list_size == 0) {	delete exit_list;	exit_list = (LinkedList *) NULL;    }}static int rcs_ready_for_exit = 0;static int rcs_exit_sig = 0;static void rcs_exit_signal_handler(int sig){    rcs_ready_for_exit = 1;    rcs_exit_sig = sig;}void rcs_exit(int code){    rcs_cleanup(code);    if (code == -1) {	rcs_print_error("\n Errors Reported!!!\n Press ^C to exit.\n");	signal(SIGINT, rcs_exit_signal_handler);	int secs = 0;	while (!rcs_ready_for_exit && secs < 600) {	    esleep(1.0);	    secs++;	}    }    exit(code);}

⌨️ 快捷键说明

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