Can I undo or remove an atexit command?

If I place `atexit( fn );` on the exit stack, it will get executed when the program exits: returns from `main()` or via `exit()`. Can I remove it from the stack? Why do I want to do this, you ask? I was experimenting with a simple try-catch mechanism using `atexit`, `setjmp` and `longjmp`. It would be just perfect if I could `undo-atexit(fn);` - even if it would only work for the last registered function. Edit: Following monoceres' suggestion to make my own stack... The stack only works with one exception catcher for now. void (*_catchFn[10])() = {0,0,0,0,0,0,0,0,0,0}; void _catch(){ if ( _catchFn[0] != 0 ){ (_catchFn[0])(); } } void _addCatch( void (*fn)() ){ _catchFn[0]=fn; } void _remCatch( void (*fn)() ){ _catchFn[0]=0; } void test(){ jmp_buf env; void catch(){ // we get here after an exit with a registered catch longjmp(env,1); // return to the line marked except... // that first will get the value 1 } int first = setjmp( env); // ** return here ** fprintf( stderr , "test: After setjmp. first=%d\n" , first ); if( first == 0 ){ // try this code _addCatch(catch); // register the catch function to 'catch' the exit fprintf( stderr , "test: Before CHECK\n" ); // CHECK something and something bad happens and it exits exit(1); // like this fprintf( stderr , "test: After CHECK - THIS SHOULD NEVER BE SEEN AFTER AN EXCEPTION.\n" ); }else{ fprintf( stderr , "test: After longjmp return. first=%d\n" , first ); } _remCatch( catch); fprintf( stderr , "test: IT WORKED!\n"); exit(1); // exit again to see if we are safe } int main(){ atexit( _catch ); // register my global exception stack test(); }
AIX does have a unatexit(); see…

以上就是Can I undo or remove an atexit command?的详细内容,更多请关注web前端其它相关文章!

赞(0) 打赏
未经允许不得转载:web前端首页 » CSS3 答疑

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

前端开发相关广告投放 更专业 更精准