Was wäre unter Linux der beste Weg für ein Programm, sich bei einem Absturz selbst neu zu starten, indem es die Ausnahme in einem Crashhandler abfängt (zum Beispiel bei einem Segfault)?
Antworten
Zu viele Anzeigen?
Ciarán
Punkte
11
Das Programm selbst sollte natürlich nicht prüfen, ob es läuft oder nicht läuft :)
Die meisten Unternehmenslösungen sind eigentlich nur ausgefallene Möglichkeiten, die Ausgabe von ps()
nach einer bestimmten Zeichenkette und führt eine Aktion aus, wenn bestimmte Kriterien erfüllt sind - d.h. wenn Ihr Prozess nicht gefunden wird, rufen Sie das Startskript auf.
enthusiasticgeek
Punkte
2542
Versuchen Sie den folgenden Code, wenn er spezifisch für Segfault ist. Dieser kann nach Bedarf geändert werden.
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <poll.h>
sigjmp_buf buf;
void handler(int sig) {
siglongjmp(buf, 1);
}
int main() {
//signal(SIGINT, handler);
//register all signals
struct sigaction new_action, old_action;
new_action.sa_handler = handler;
sigemptyset (&new_action.sa_mask);
new_action.sa_flags = 0;
sigaction (SIGSEGV, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN)
sigaction (SIGSEGV, &new_action, NULL);
if (!sigsetjmp(buf, 1)){
printf("starting\n");
//code or function/method here
}
else{
printf("restarting\n");
//code or function/method here
}
while(1) {
poll(NULL,0,100); //ideally use usleep or nanosleep. for now using poll() as a timer
printf("processing...\n");
}
return 0; //or exit(SUCESS)
}
- See previous answers
- Weitere Antworten anzeigen