relancer une application après une erreur critique
4 réponses
Vincent Torri
Je voudrais connaître le moyen usuel pour relancer une application après
une erreur critique (comme un segmentation fault. Visual Studio, quand il
plante, se relance par exemple). Déjà, pour récupérer l'erreur, j'utilise
signal() ainsi :
static void
_es_signal_cb(int signal)
{
if (signal == SIGSEGV)
{
printf("access violation\n");
}
else if (signal == SIGILL)
{
printf("illegal instruction\n");
}
else if (signal == SIGFPE)
{
printf("floating point error\n");
}
else if (signal == SIGABRT)
{
printf("abnormal termination\n");
}
else
{
printf("unexpected signal (%d)\n", signal);
return;
}
}
int main()
{
Es_Signal_Cb previous_cb;
/* access violation (SIGSEGV) */
previous_cb = signal(SIGSEGV, _es_signal_segv_cb);
if (previous_cb == SIG_ERR)
{
printf("can not set up signal handler SIGSEGV (%s)\n", strerror
(errno));
printf("Exiting...\n");
return -1;
}
/* illegal instruction (SIGILL) */
previous_cb = signal(SIGILL, _es_signal_ill_cb);
if (previous_cb == SIG_ERR)
{
printf("can not set up signal handler SIGILL (%s)\n", strerror
(errno));
printf("Exiting...\n");
return -1;
}
/* floating point error (SIGFPE) */
previous_cb = signal(SIGFPE, _es_signal_fpe_cb);
if (previous_cb == SIG_ERR)
{
printf("can not set up signal handler SIGFPE (%s)\n", strerror
(errno));
printf("Exiting...\n");
return -1;
}
/* abnormal termination (SIGABRT) */
previous_cb = signal(SIGABRT, _es_signal_abrt_cb);
if (previous_cb == SIG_ERR)
{
printf("can not set up signal handler SIGABRT (%s)\n", strerror
(errno));
printf("Exiting...\n");
return -1;
}
abort();
return 0;
}
[/code]
(abort() est là pour faire un test). Donc il faut que je rajoute du code
dans _es_signal_cb() pour relancer l'application. Mais je n'ai pas trop
d'idées (je pourrais avec un execvp() relancer l'appli, peut-être)
Quelqu'un connaît-il le moyen standard pour faire ceci ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fred
"Vincent Torri" a écrit dans le message de news:
Je voudrais connaître le moyen usuel pour relancer une application après une erreur critique (comme un segmentation fault. Visual Studio, quand il plante, se relance par exemple). Déjà, pour récupérer l'erreur, j'utilise signal() ainsi :
Sous Windows, c'est les SEH et depuis Vista, avec les apis genre RegisterApplicationRestart http://msdn.microsoft.com/en-us/library/windows/desktop/ee663265(v=VS.85).aspx
"Vincent Torri" <vincent.torri@gmail.com> a écrit dans le message de news:
XnF9FC8A3E74DDFvincenttorrigmailcom@94.75.214.90...
Je voudrais connaître le moyen usuel pour relancer une application après
une erreur critique (comme un segmentation fault. Visual Studio, quand il
plante, se relance par exemple). Déjà, pour récupérer l'erreur, j'utilise
signal() ainsi :
Sous Windows, c'est les SEH et depuis Vista, avec les apis genre
RegisterApplicationRestart
http://msdn.microsoft.com/en-us/library/windows/desktop/ee663265(v=VS.85).aspx
Je voudrais connaître le moyen usuel pour relancer une application après une erreur critique (comme un segmentation fault. Visual Studio, quand il plante, se relance par exemple). Déjà, pour récupérer l'erreur, j'utilise signal() ainsi :
Sous Windows, c'est les SEH et depuis Vista, avec les apis genre RegisterApplicationRestart http://msdn.microsoft.com/en-us/library/windows/desktop/ee663265(v=VS.85).aspx
Bertrand Lenoir-Welter
Bonjour
Je fais ça avec un simple programme à qui je passe en argument le nom de l'appli à relancer avec ses arguments, après un délai permettant à l'appelant de vider les lieux. Simple mais efficace.
Bonjour
Je fais ça avec un simple programme à qui je passe en argument le nom de
l'appli à relancer avec ses arguments, après un délai permettant à
l'appelant de vider les lieux. Simple mais efficace.
Je fais ça avec un simple programme à qui je passe en argument le nom de l'appli à relancer avec ses arguments, après un délai permettant à l'appelant de vider les lieux. Simple mais efficace.
Je fais ça avec un simple programme à qui je passe en argument le nom de l'appli à relancer avec ses arguments, après un délai permettant à l'appelant de vider les lieux. Simple mais efficace.
Je fais ça avec un simple programme à qui je passe en argument le nom de
l'appli à relancer avec ses arguments, après un délai permettant à
l'appelant de vider les lieux. Simple mais efficace.
Je fais ça avec un simple programme à qui je passe en argument le nom de l'appli à relancer avec ses arguments, après un délai permettant à l'appelant de vider les lieux. Simple mais efficace.
ok, merci. Avec execvp ou CreateProcess ?
Bertrand Lenoir-Welter
ok, merci. Avec execvp ou CreateProcess ?
J'utilise plutôt CreateProcess(), mais ça doit marcher aussi avec un ShellExecute() ou autres.
ok, merci. Avec execvp ou CreateProcess ?
J'utilise plutôt CreateProcess(), mais ça doit marcher aussi avec un
ShellExecute() ou autres.