Frage

Wenn ich Platz atexit( fn ); auf dem Austritt Stapel, wird es ausgeführt werden, wenn das Programm beendet wird. Erträge aus main() oder über exit()

Kann ich es aus dem Stapel entfernen?

Warum will ich, dies zu tun, fragen Sie?

Ich war das Experimentieren mit einem einfachen try-catch-Mechanismus atexit, setjmp und longjmp. Es wäre einfach perfekt, wenn ich undo-atexit(fn); könnte -. Auch wenn es würde nur Arbeit für die letzte registrierte Funktion

Edit:

monoceres' Vorschlag Nach meinem eigenen Stapel zu machen ...

Der Stapel nur mit einer Ausnahme catcher funktioniert jetzt.

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();
}
War es hilfreich?

Lösung

Warum Ihre eigenen Stack nicht bauen, dass Sie aus einem einzigen atexit () aufrufen Funktion? So können Sie den Stapel manipulieren könnten alle Sie wollen.

Andere Tipps

Nein, man kann es nicht tun, aber Sie können globalen Flag verwenden, damit Ihr Exit-Handler wird nichts tun, wenn das Flag gesetzt ist.

Alternativ können Sie _Exit() nennen (C99) -. Es normal Exit-Prozedur durchführen wird (schließen Sie alle offenen Deskriptoren, senden alle notwendigen Signale und Eltern / Kinder), aber nicht Ausfahrt Handler aufrufen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top