[résolu] [C] errx() et appel fonctions atexit() - que dit le standard?

errx() et appel fonctions atexit() - que dit le standard? [résolu] [C] - C - Programmation

Marsh Posté le 25-08-2023 à 18:58:09    

Bonsoir,
 
j'ai un doute sur un comportement assez spécifique. Soit le programme basique

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <err.h>
  4. void bye(void)
  5. {
  6.     printf("bye\n" );
  7. }
  8. int main(void)
  9. {
  10.     atexit(&bye);
  11.    
  12.     errx(42, "oh non!" );
  13.    
  14.     return 0;
  15. }

.
 
Sur mon PC (Debian 12) j'ai bien la fonction bye() qui est appellée lors du errx(), en effet on peut voir dans le source de la glibc que errx() appelle exit() et donc les fonctions "enregistrées" avec atexit().
 
Très bien, sauf que je n'arrive pas à trouver si c'est un comportement standardisé ou dépendant de l'implémentation de la lib' standard qu'on utilise. J'ai regardé dans les man-page mais c'est pas clair (pour moi :o ). Quelqu'un sait si le standard C/C99 dit quelque chose là-dessus ou un standard POSIX ou autre?
 
C'est important car je me demande si je peux mettre le code qui va réellement écrire mon fichier log dans une fonction qui j'enregistre avec atexit() ou si c'est pas une bonne idée si j'utilise err()/errx(). :??:  
 
(Le "fichier log" est un poil plus complexe qu'un simple fopen(), car sinon le buffer serait de toute façon écrit sur le HDD quand le programme se termine vu que tout les file descriptors sont fermés...)
 
Désolé pour le franglais. :o


Message édité par rat de combat le 26-08-2023 à 20:18:05

---------------
Si vous ouvrez un sujet merci de ne pas le "laisser mourir" subitement et de le marquer comme "résolu" le cas échéant!
Reply

Marsh Posté le 25-08-2023 à 18:58:09   

Reply

Marsh Posté le 25-08-2023 à 22:44:18    

Ça me semble assez clair que c'est bon:
man atexit dit:
> The  atexit() function registers the given function to be called at normal process termination, either via exit(3) or via return from the program's main().
et man errx dit
> The err(), verr(), errx(), and verrx() functions do not return, but exit with the value of the argument eval.
 
On est bien dans le cas d'une normal process termination (contrairement à un kill, comme dit dans man atexit).

Reply

Marsh Posté le 26-08-2023 à 07:01:27    

Ah ok, je butais sur le "normal process termination". Donc SIGKILL/SIGSEGV/... -> pas de fonctions atexit() mais sinon oui?
 
Merci! :jap:


---------------
Si vous ouvrez un sujet merci de ne pas le "laisser mourir" subitement et de le marquer comme "résolu" le cas échéant!
Reply

Marsh Posté le 26-08-2023 à 10:25:54    

Une erreur est toujours possible (c'est le cas de le dire :o ), mais je dirais oui  :)

Reply

Marsh Posté le 26-08-2023 à 20:17:47    

Très bien, merci! :jap:  On apprend tout les jours. :hello:


---------------
Si vous ouvrez un sujet merci de ne pas le "laisser mourir" subitement et de le marquer comme "résolu" le cas échéant!
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed