Thread: What would be the alternative to signal.h with just windows.h?

  1. #1
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,733

    What would be the alternative to signal.h with just windows.h?

    Trying to write my library to be completely unreliant on the CRT (since that has far too many versions to deal with), I've gotten past a number of issues in doing that but replacing the SIGINT etc has eluded me. Here's what I've got so far (I know there's codes taking matching numbers on the win32 variant at the moment but for now they're just to indicate to me what I can possibly work with):

    Code:
    #ifndef INC_PAWSIG_H
    #	define INC_PAWSIG_H
    #	include "../pawsys.h"
    PAW_OPEN_C_API
    extern const int *_pawsig_list;
    extern const int _pawsig_leng;
    PAW_API void _pawinit_pawsig_list(void);
    enum
    {
    	_PAWSIG_NONE = 0,
    	_PAWSIG_HANG_UP,
    	_PAWSIG_UNDEF_INST,
    #	define PAWSIG_UNDEF_INST _pawsig_list[_PAWSIG_UNDEF_INST]
    	_PAWSIG_UNDEF_MATH,
    #	define PAWSIG_UNDEF_MATH _pawsig_list[_PAWSIG_UNDEF_MATH]
    	_PAWSIG_URGENT_SOCKET_IO,
    	_PAWSIG_ERROR_BREAKPOINT,
    	_PAWSIG_FORCE_BREAKPOINT,
    	_PAWSIG_KEYBD_BREAKPOINT,
    	_PAWSIG_DEBUG_BREAKPOINT,
    	_PAWSIG_TIMER_BREAKPOINT,
    	_PAWSIG_RESUME_EXECUTION,
    	_PAWSIG_BACKGROUND_TTYRD,
    #	define PAWSIG_BACKGROUND_TTYRD _pawsig_list[_PAWSIG_BACKGROUND_TTYRD]
    	_PAWSIG_BACKGROUND_TTYWR,
    #	define PAWSIG_BACKGROUND_TTYWR _pawsig_list[_PAWSIG_BACKGROUND_TTYWR]
    	_PAWSIG_EXCEEDED_ENTSIZE,
    	_PAWSIG_EXCEEDED_CPUTIME,
    	_PAWSIG_FAULTY_PIPE_HOOK,
    	_PAWSIG_FAULTY_LOCATION,
    	_PAWSIG_FORCE_TERMINATE,
    	_PAWSIG_ORDER_TERMINATE,
    	_PAWSIG_ASKED_TERMINATE,
    	_PAWSIG_WEIRD_TERMINATE,
    	_PAWSIG_IO_STATE_CHANGE,
    	_PAWSIG_CHILD_PROC_DIED,
    	_PAWSIG_CUSTOM_MSG_CODE,
    	_PAWSIG_CUSTOM_MSG_TEXT,
    	/* Just in case there's signals I haven't accounted for to start with */
    	_PAWSIG_COUNT = 0xFF
    };
    
    #	ifdef CODE_PAW
    int _pawsig_list_[_PAWSIG_COUNT = {0};
    const int *_pawsig_list = _pawsig_list_;
    const int _pawsig_leng = _PAWSIG_COUNT;
    #		ifdef PAW_API_MSW
    PAW_API void _pawinit_pawsig_list(void)
    {
    	_pawsig_list_[ _PAWSIG_NONE ] = 0;
    	_pawsig_list_[ _PAWSIG_HANG_UP ] =;
    	_pawsig_list_[ _PAWSIG_UNDEF_INST ] = CTRL_C_EVENT;
    	_pawsig_list_[ _PAWSIG_UNDEF_MATH ] =;
    	_pawsig_list_[ _PAWSIG_URGENT_SOCKET_IO ] =;
    	_pawsig_list_[ _PAWSIG_ERROR_BREAKPOINT ] =;
    	_pawsig_list_[ _PAWSIG_FORCE_BREAKPOINT ] = -CTRL_BREAK_EVENT;
    	_pawsig_list_[ _PAWSIG_KEYBD_BREAKPOINT ] = WM_KEYDOWN;
    	_pawsig_list_[ _PAWSIG_DEBUG_BREAKPOINT ] = CTRL_BREAK_EVENT;
    	_pawsig_list_[ _PAWSIG_TIMER_BREAKPOINT ] = WM_TIMER;
    	_pawsig_list_[ _PAWSIG_RESUME_EXECUTION ] =;
    	_pawsig_list_[ _PAWSIG_BACKGROUND_TTYRD ] =;
    	_pawsig_list_[ _PAWSIG_BACKGROUND_TTYWR ] =;
    	_pawsig_list_[ _PAWSIG_EXCEEDED_ENTSIZE ] =;
    	_pawsig_list_[ _PAWSIG_EXCEEDED_CPUTIME ] =;
    	_pawsig_list_[ _PAWSIG_FAULTY_PIPE_HOOK ] =;
    	_pawsig_list_[ _PAWSIG_FAULTY_LOCATION ] = -WM_APP;
    	_pawsig_list_[ _PAWSIG_FORCE_TERMINATE ] = WM_QUIT;
    	_pawsig_list_[ _PAWSIG_ORDER_TERMINATE ] = WM_ENDSESSION;
    	_pawsig_list_[ _PAWSIG_ASKED_TERMINATE ] = WM_QUERYENDSESSION;
    	_pawsig_list_[ _PAWSIG_WEIRD_TERMINATE ] = -WM_QUIT;
    	_pawsig_list_[ _PAWSIG_IO_STATE_CHANGE ] = WM_INPUT_DEVICE_CHANGE;
    	_pawsig_list_[ _PAWSIG_CHILD_PROC_DIED ] = -WM_QUIT;
    	_pawsig_list_[ _PAWSIG_CUSTOM_MSG_CODE ] = WM_APP;
    	_pawsig_list_[ _PAWSIG_CUSTOM_MSG_TEXT ] = 0xC000;
    };
    #else
    #include <signal.h>
    /* Used bits/signum-generic.h on my linux build to decide these */
    PAW_API void _pawinit_pawsig_list(void)
    {
    	_pawsig_list_[ _PAWSIG_HANG_UP	] = SIGHUP;
    	_pawsig_list_[ _PAWSIG_UNDEF_INST	] = SIGILL;
    	_pawsig_list_[ _PAWSIG_UNDEF_MATH	] = SIGFPE;
    	_pawsig_list_[ _PAWSIG_URGENT_SOCKET_IO	] = SIGURG;
    	_pawsig_list_[ _PAWSIG_ERROR_BREAKPOINT	] = SIGINT;
    	_pawsig_list_[ _PAWSIG_FORCE_BREAKPOINT	] = SIGSTOP;
    	_pawsig_list_[ _PAWSIG_KEYBD_BREAKPOINT	] = SIGTSTP;
    	_pawsig_list_[ _PAWSIG_DEBUG_BREAKPOINT ] = SIGTRAP;
    	_pawsig_list_[ _PAWSIG_TIMER_BREAKPOINT	] = SIGALRM;
    	_pawsig_list_[ _PAWSIG_RESUME_EXECUTION	] = SIGCONT;
    	_pawsig_list_[ _PAWSIG_BACKGROUND_TTYRD	] = SIGTTIN;
    	_pawsig_list_[ _PAWSIG_BACKGROUND_TTYWR	] = SIGTTOU;
    	_pawsig_list_[ _PAWSIG_EXCEEDED_ENTSIZE	] = SIGXFSZ;
    	_pawsig_list_[ _PAWSIG_EXCEEDED_CPUTIME	] = SIGXCPU;
    	_pawsig_list_[ _PAWSIG_FAULTY_PIPE_HOOK	] = SIGPIPE;
    	_pawsig_list_[ _PAWSIG_FAULTY_LOCATION	] = SIGSEGV;
    	_pawsig_list_[ _PAWSIG_FORCE_TERMINATE	] = SIGKILL;
    	_pawsig_list_[ _PAWSIG_ORDER_TERMINATE	] = SIGTERM;
    	_pawsig_list_[ _PAWSIG_ASKED_TERMINATE	] = SIGQUIT;
    #		ifdef SIGABRT
    	_pawsig_list_[ _PAWSIG_WEIRD_TERMINATE	] = SIGABRT;
    #		else
    	_pawsig_list_[ _PAWSIG_WEIRD_TERMINATE	] = SIGIOT;
    #		endif
    #		ifdef SIGPOLL
    	_pawsig_list_[ _PAWSIG_IO_STATE_CHANGE	] = SIGPOLL;
    #		else
    	_pawsig_list_[ _PAWSIG_IO_STATE_CHANGE	] = SIGIO;
    #		endif
    #		ifdef SIGCHLD
    	_pawsig_list_[ _PAWSIG_CHILD_PROC_DIED	] = SIGCHLD;
    #		else
    	_pawsig_list_[ _PAWSIG_CHILD_PROC_DIED	] = SIGCLD;
    #		endif
    	_pawsig_list_[ _PAWSIG_CUSTOM_MSG_CODE ] = SIGUSR1;
    	_pawsig_list_[ _PAWSIG_CUSTOM_MSG_TEXT ] = SIGUSR2;
    };
    #		endif
    #	endif
    PAW_SHUT_C_API
    #endif

  2. #2

  3. #3
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,733
    Just in case anyone was interested, this is how I'm planning to implement exception handling without bugging out the CRT if it happens to be active:
    Code:
    PAW_OPEN_C_API
    PAW_API void _pawinit_pawsig_list(void);
    typedef struct
    {
    	pawd sys;
    	/* This will be one of the enum values below */
    	pawd paw;
    	/* Can execution continue after this signal? */
    	pawb light;
    	/* Whatever you wanted to pass */
    	pawp ud;
    } pawsig;
    typedef struct _pawsig_cb pawsig_cb;
    typedef void (*_pawsig_cb_)( pawsig *sig );
    /* Always declare static and always as { NULL, NULL, <callback> },
     * the pointers will be set during the pawsig_catcb call */
    struct _pawsig_cb { pawsig_cb *prev, *next; _pawsig_cb_ cb; };
    extern const pawsig *_pawsigs;
    extern const int _pawsignals;
    enum
    {
    	_PAWSIG_NONE = 0,
    	_PAWSIG_HANG_UP,
    	_PAWSIG_UNDEF_INST,
    #	define PAWSIG_UNDEF_INST _pawsig_list[_PAWSIG_UNDEF_INST]
    	_PAWSIG_UNDEF_MATH,
    #	define PAWSIG_UNDEF_MATH _pawsig_list[_PAWSIG_UNDEF_MATH]
    	_PAWSIG_INT_DIVBY0,
    	_PAWSIG_INT_PARTIAL,
    	_PAWSIG_INT_OVERFLOW,
    	_PAWSIG_INT_UNDERFLOW,
    	_PAWSIG_FPN_DIVBY0,
    	_PAWSIG_FPN_2SMALL,
    	_PAWSIG_FPN_PARTIAL,
    	_PAWSIG_FPN_STACKCHK,
    	_PAWSIG_FPN_OVERFLOW,
    	_PAWSIG_FPN_UNDERFLOW,
    	_PAWSIG_URGENT_SOCKET_IO,
    	_PAWSIG_ERROR_BREAKPOINT,
    	_PAWSIG_FORCE_BREAKPOINT,
    	_PAWSIG_KEYBD_BREAKPOINT,
    	_PAWSIG_DEBUG_BREAKPOINT,
    	_PAWSIG_TIMER_BREAKPOINT,
    	_PAWSIG_RESUME_EXECUTION,
    	_PAWSIG_BACKGROUND_TTYRD,
    #	define PAWSIG_BACKGROUND_TTYRD _pawsig_list[_PAWSIG_BACKGROUND_TTYRD]
    	_PAWSIG_BACKGROUND_TTYWR,
    #	define PAWSIG_BACKGROUND_TTYWR _pawsig_list[_PAWSIG_BACKGROUND_TTYWR]
    	_PAWSIG_EXCEEDED_ENTSIZE,
    	_PAWSIG_EXCEEDED_CPUTIME,
    	_PAWSIG_FAULTY_PIPE_HOOK,
    	_PAWSIG_FAULTY_LOCATION,
    	_PAWSIG_FORCE_TERMINATE,
    	_PAWSIG_ORDER_TERMINATE,
    	_PAWSIG_ASKED_TERMINATE,
    	_PAWSIG_WEIRD_TERMINATE,
    	_PAWSIG_IO_STATE_CHANGE,
    	_PAWSIG_CHILD_PROC_DIED,
    	_PAWSIG_CUSTOM_MSG_CODE,
    	_PAWSIG_CUSTOM_MSG_TEXT,
    	/* Just in case there's signals I haven't accounted for to start with */
    	_PAWSIG_COUNT = 0xFF
    };
    
    #	ifdef CODE_PAW
    pawsig _pawsigs_[_PAWSIG_COUNT] = {{0}};
    const pawsig *_pawsigs = _pawsigs_;
    const int _pawsignals = _PAWSIG_COUNT;
    pawsig_cb _pawsig_head_cb = {NULL}, _pawsig_last_cb = {NULL};
    #		ifdef PAW_API_MSW
    void *_pawthisapp_light = NULL, *_pawthisapp_fatal = NULL;
    LONG _pawsigthisapp( EXCEPTION_POINTERS *info )
    {
    	pawsig_cb *link = _pawsig_head_cb.next;
    	EXCEPTION_RECORD *rec = info->ExceptionRecord;
    	pawp  **all = rec->ExceptionInformation;
    	pawsig *sig = all[1];
    	/* Ensure the exception is for this handler */
    	if ( all[0] != &_pawsig_head_cb )
    		return EXCEPTION_CONTINUE_SEARCH;
    	for ( ; link; link = link->next )
    		link->cb( sig );
    	return sig->light ? EXCEPTION_CONTINUE_EXECUTION : 0;
    }
    void pawsigall( pawsig *sig )
    {
    	pawp pass[2] = { &_pawsig_head_cb, sig };
    	RaiseException( sig->sys, sig->light * EXCEPTION_NONCONTINUABLE, 2, pass );
    }
    void pawsig_catcb( pawsig_cb *link )
    {
    	pawsig_cb *last = _pawsig_last_cb.prev;
    	link->prev = last;
    	last->next = link;
    }
    PAW_API void _pawinit_pawsig_list(void)
    {
    	unsigned int i = 0;
    	pawsig *all = _pawsigs_;
    	_pawsig_last_cb.prev = &_pawsig_head_cb;
    	_pawthisapp_light = AddVectoredContinueHandler(1,_pawsigthisapp);
    	_pawthisapp_fatal = AddVectoredExceptionHandler(1,_pawsigthisapp);
    	for ( ; i < _PAWSIG_COUNT; ++i )
    		_pawsigs_[i].paw = i;
    	all[ _PAWSIG_NONE ].sys = 0;
    	all[ _PAWSIG_HANG_UP ].sys = EXCEPTION_BREAKPOINT;
    	all[ _PAWSIG_UNDEF_INST ].sys = EXCEPTION_ILLEGAL_INSTRUCTION;
    	all[ _PAWSIG_UNDEF_MATH ].sys = EXCEPTION_FLT_INVALID_OPERATION;
    	all[ _PAWSIG_FPN_DIVBY0 ].sys = EXCEPTION_FLT_DIVIDE_BY_ZERO;
    	all[ _PAWSIG_FPN_2SMALL ].sys = EXCEPTION_FLT_DENORMAL_OPERAND;
    	all[ _PAWSIG_FPN_PARTIAL ].sys = EXCEPTION_FLT_INEXACT_RESULT;
    	all[ _PAWSIG_FPN_STACKCHK ].sys = EXCEPTION_FLT_STACK_CHECK;
    	all[ _PAWSIG_FPN_OVERFLOW ].sys = EXCEPTION_FLT_OVERFLOW;
    	all[ _PAWSIG_FPN_UNDERFLOW ].sys = EXCEPTION_FLT_UNDERFLOW;
    	all[ _PAWSIG_URGENT_SOCKET_IO ].sys =;
    	all[ _PAWSIG_ERROR_BREAKPOINT ].sys =;
    	all[ _PAWSIG_FORCE_BREAKPOINT ].sys = EXCEPTION_BREAKPOINT;
    	all[ _PAWSIG_KEYBD_BREAKPOINT ].sys = WM_KEYDOWN;
    	all[ _PAWSIG_DEBUG_BREAKPOINT ].sys = DBG_CONTROL_C;
    	all[ _PAWSIG_TIMER_BREAKPOINT ].sys = WM_TIMER;
    	all[ _PAWSIG_RESUME_EXECUTION ].sys =;
    	all[ _PAWSIG_BACKGROUND_TTYRD ].sys =;
    	all[ _PAWSIG_BACKGROUND_TTYWR ].sys =;
    	all[ _PAWSIG_EXCEEDED_ENTSIZE ].sys =;
    	all[ _PAWSIG_EXCEEDED_CPUTIME ].sys =;
    	all[ _PAWSIG_FAULTY_PIPE_HOOK ].sys =;
    	all[ _PAWSIG_FAULTY_LOCATION ].sys = EXCEPTION_ACCESS_VIOLATION;
    	all[ _PAWSIG_FORCE_TERMINATE ].sys = WM_QUIT;
    	all[ _PAWSIG_ORDER_TERMINATE ].sys = WM_ENDSESSION;
    	all[ _PAWSIG_ASKED_TERMINATE ].sys = WM_QUERYENDSESSION;
    	all[ _PAWSIG_WEIRD_TERMINATE ].sys = -WM_QUIT;
    	all[ _PAWSIG_IO_STATE_CHANGE ].sys = WM_INPUT_DEVICE_CHANGE;
    	all[ _PAWSIG_CHILD_PROC_DIED ].sys = -WM_QUIT;
    	all[ _PAWSIG_CUSTOM_MSG_CODE ].sys = WM_APP;
    	all[ _PAWSIG_CUSTOM_MSG_TEXT ].sys = 0xC000;
    };
    #else
    Still editing atm but that's the rough direction I plan to go now.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Signal in windows
    By kalamram in forum Windows Programming
    Replies: 1
    Last Post: 11-04-2009, 09:25 PM
  2. Any alternative?
    By sCandal2 in forum Windows Programming
    Replies: 4
    Last Post: 01-11-2006, 04:30 PM
  3. gets() alternative
    By Mastadex in forum C Programming
    Replies: 5
    Last Post: 12-12-2004, 12:28 AM
  4. Windows API alternative data types
    By punkrockguy318 in forum C++ Programming
    Replies: 8
    Last Post: 01-02-2004, 07:23 PM
  5. alternative to cin
    By Unregistered in forum C++ Programming
    Replies: 18
    Last Post: 06-25-2002, 05:14 PM

Tags for this Thread