IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

fonction atexit et arguments


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut fonction atexit et arguments
    Bonjour à tous,

    j'aimerai savoir si il est possible de spécifier les arguments pour une fonction désignée dans atexit.

    Je m'explique... Je veux exécuter un programme externe avec C et envoyer automatiquement un email contenant le résultat dès que l'exécution à fini.
    J4ai donc la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int p=fork();
    		if(p>0)
    		{
    			wait(NULL);
    			printf("Je suis le père\n");			
    		}
     
    		else
    		{
    			atexit(envoie_mail); //sera executé quand le processus aura fini
     
    			//Eexecution + recuperation du résultat
                            resultat = exec(programme);
    			exit(0);
    		}
    Ce que je voudrais c'est de pouvoir passer en argument de la fonction envoie_mail la variable contenant le résultat.

    Je ne pense pas que atexit(envoie_mail(resultat)) soit autorisé?

    Merci d'avance

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Impossible en C standard sans passé par une variable globale (ou statique). Il existe une extension GNU, disponible sur les systèmes avec une glibc, on_exit().
    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut
    Merci pour l'information

    Glibc est une extension à installer ou il suffit de l'importer?
    Je suis sous ubuntu.

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par dvp_zero Voir le message
    Glibc est une extension à installer ou il suffit de l'importer?
    Je suis sous ubuntu.
    Alors c'est déjà installé... pas le choix même
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut
    Merci

  6. #6
    Membre habitué Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 133
    Points
    133
    Par défaut
    Importer la glib juste pour ça, autant utiliser une variable globale, non?

  7. #7
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Attention il ne s'agit pas de la glib mais de la glibc : gnu C library.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  8. #8
    Membre habitué Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Points : 133
    Points
    133
    Par défaut
    My bad, j'avais mal lu.

    Par contre du coup le code ne sera plus portable sur Windows.

  9. #9
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Absolument et pas uniquement sous Windows, c'est ce que voulait dire ma première phrase:
    Impossible en C standard sans passé par une variable globale (ou statique).
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    D'un autre côté, vouloir faire un processus "complexe" à la sortie du programme, quand tu risques d'avoir je ne sais combien de modules plus ou moins HS, cela ressemble fort à une grosse erreur de conception... Faudrait mieux définir une exécution SESE (Single-entry single-exit), et envoyer ton mail avant le return final : d'une part, c'est portable, et d'autre part, tu évitera les effets de bord dûs à la terminaison du processus.

    Par exemple, sous Windows :
    Citation Envoyé par MSDN
    The code in the atexit function should not contain any dependency on any DLL which could have already been unloaded when the atexit function is called.
    Citation Envoyé par MSDN
    In the case when _onexit is called from within a DLL, routines registered with _onexit run on a DLL's unloading after DllMain is called with DLL_PROCESS_DETACH.
    Or, beaucoup de fonctions sous Windows sont dans des DLL... Tu risques un plantage sévère si tu utilises quoi que ce soit qui ne soit pas totalement inclus dans la CLib ! Et ça m'étonnerait beaucoup qu'un envoi de mail fasse partie de la CLib, à moins de l'envoyer en tapant directement dans les sockets...

    Au pire, si tu n'as pas déjà un code SESE, tu peux toujours dégager le code de ton main dans une fonction, et simplifier ton main de façon à appeler cette fonction, récupérer le code de sortie, envoyer ton mail et enfin terminer ton main en renvoyant ledit code de sortie.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    en fait j'ai procédé de cette façon car le but sera de faire tourner ceci sur un serveur linux et permettre à des clients d'exécuter des programmes installé sur ce serveur. J'ai donc toute une partie php qui communiquera par socket avec mon programme C.

    Mon programme C se chargera donc :
    1. de récuperer via la socket le nom du programme à exécuter. Un processus fils est alors créer pour chaque exécution voulue
    2. exécuter les programmes en fonction des choix des utilisateurs et à chaque fin d'exécution, j'envoie un email en faisant un appel avec execl sur un script php d'envoie d'email.

    Ma fonction pointée par on_exit serait donc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void envoie_mail(int code, struct Email *mail)
    {
    	(void)code;
    	printf("L'email est envoye \n Resultat : %s",mail->result);
    	execl("/usr/bin/php","php","sendEmail.php",mail->result,NULL);
    }
    Ais-je mal pensée la structure de mon programme?

    De plus, je me suis dit que j'aurai ainsi pu prévenir l'utilisateur si une exécution s'était mal déroulée en fonction du code de retour.

    De plus je ne tenais pas compte de la portabilité étant donné que je sais à quel machine ceci sera destiné (et y rester).

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fonction callback avec arguments
    Par YuGiOhJCJ dans le forum GTK+ avec C & C++
    Réponses: 12
    Dernier message: 12/04/2013, 08h42
  2. Réponses: 14
    Dernier message: 16/05/2006, 11h26
  3. Fonction callback avec arguments ?
    Par sorry60 dans le forum GTK+ avec C & C++
    Réponses: 39
    Dernier message: 07/11/2005, 10h41
  4. fonction unserialize et argument
    Par Ti Jen-tsie dans le forum Langage
    Réponses: 1
    Dernier message: 29/10/2005, 20h08
  5. fonction dont les argument sont dans un dico
    Par GConstant dans le forum Général Python
    Réponses: 1
    Dernier message: 12/08/2004, 18h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo