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 :

Exit ou return sur un processus fils(fork) ?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 31
    Points : 25
    Points
    25
    Par défaut Exit ou return sur un processus fils(fork) ?
    Bonjour,

    Voici le code en rapport avec ma question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(int argc, char *argv[]) {
    	pid_t fils;
     
    	if ((fils = fork()) == 0)
    	{
    		printf("Fin du fils\n");
    		return EXIT_FAILURE;
    		// exit(EXIT_FAILURE);
    	}
     
    	printf("Fin du pere\n");
    	return EXIT_SUCCESS;
    }
    A la fin du processus fils, quelle est la meilleure façon de quitter le processus ? Via un exit ou via un return ?
    En toute logique, je me dis :
    • Le fork crée un processus fils indépendant du père et il se trouve dans son propre main.
    • Dès lors, il peut être quitter comme le père via un return ou via un exit.

    Donc pour moi, les deux solutions sont bonnes. Mais quelle est la meilleure ?

    Un grand merci

  2. #2
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Ni l'un ni l'autre

    Tu dois utiliser _exit() dans le fils. _exit() n'appelle pas les eventuels handler enregistres aupres de atexit() dans le pere.
    Le probleme d'appeller exit() dans le fils, c'est que ca a pour effet de bord d'appeler les eventuels atexit handler declare dans le pere. En gros, tu peux changer l'etat du processus parent en quittant le fils.

    _exit() ne fait pas ca, et detruit juste le processus dans le noyau, sans netoyage qui est normallement a la responsabilite du pere. Le man te dira specifiquement les differences.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Merci pour ta réponse claire

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Citation Envoyé par valda117 Voir le message
    A la fin du processus fils, quelle est la meilleure façon de quitter le processus ? Via un exit ou via un return ?
    Ça revient au même. Au moins en C99 :

    Citation Envoyé par n1256
    5.1.2.2.3 Program termination
    1
    If the return type of the main function is a type compatible with int, a return from the
    initial call to the main function is equivalent to calling the exit function with the value
    returned by the main function as its argument; 10) reaching the } that terminates the
    main function returns a value of 0. If the return type is not compatible with int, termination status returned to the host environment is unspecified.
    Forward references: definition of terms (7.1.1), the exit function (7.20.4.3).

    Si tu veux faire un choix, préfère return car, sur la forme, ça respecte la sémantique de la fonction « int main (...) » qui est censée renvoyer un int, ça évite de recourir d'emblée à l'utilisation d'une fonction tierce et, surtout, ça te dissuades de l'utiliser ailleurs. Ce n'est pas interdit mais, par définition, ça laisse tout en plan même si le système est capable de nettoyer ce qui est de son ressort, et ça traduit généralement le fait qu'on s'est mis dans une impasse. En pratique, par contre, exit() sera de toutes façon appelée à la fin de ta fonction main().

    Citation Envoyé par dahtah Voir le message
    Ni l'un ni l'autre

    Tu dois utiliser _exit() dans le fils. _exit() n'appelle pas les eventuels handler enregistres aupres de atexit() dans le pere.
    Le probleme d'appeller exit() dans le fils, c'est que ca a pour effet de bord d'appeler les eventuels atexit handler declare dans le pere. En gros, tu peux changer l'etat du processus parent en quittant le fils.
    Absolument pas. Un processus engendré par fork() reste complètement indépendant de son père, même si celui reçoit un signal quand il prend fin. Le processus fils hérite bien d'une copie des handlers définis par le père avec atexit() mais ceux-ci sont appelés en tant que fonctions du processus fils et n'influent pas du tout sur le père s'ils ne sont pas explicitement conçus pour le faire.

    En outre, recourir à _exit() pour contourner un problème qui se présente à nous plutôt que résoudre ses causes en amont n'est pas une bonne approche non plus.

  5. #5
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Absolument pas. Un processus engendré par fork() reste complètement indépendant de son père, même si celui reçoit un signal quand il prend fin. Le processus fils hérite bien d'une copie des handlers définis par le père avec atexit() mais ceux-ci sont appelés en tant que fonctions du processus fils et n'influent pas du tout sur le père s'ils ne sont pas explicitement conçus pour le faire.
    C'est exact, man atexit confirme:
    When a child process is created via fork(2), it inherits copies of
    its parent's registrations. Upon a successful call to one of the
    exec(3) functions, all registrations are removed.
    Je pensais avoir lu quelque part que ce n'etait pas le cas. Autant pour moi valda117, j'aurais du verifier.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Merci Obsidian pour l'info.

    Ok, je vais opter pour le return, mon idée de départ

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Attention, _Exit est C99, et _exit est specifique unix.

    Et sinon, ton appel a fork n'est pas bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    fils = fork();
     
    switch (fils)
    {
      case -1 : /* ERROR */
           break;
      case 0 : /* fils */
           break;
      default : /* pere */
           break;
    }
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

Discussions similaires

  1. terminaison du processus fils
    Par zahira dans le forum POSIX
    Réponses: 3
    Dernier message: 08/04/2006, 13h35
  2. [2000] Activité en cours\Informations sur les processus
    Par Débéa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/02/2006, 11h42
  3. demande d'information sur les processus sql server
    Par patrick B dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 02/11/2005, 14h04
  4. Agir à distance sur les processus des utilisateurs
    Par kuranes dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 11/10/2005, 10h18
  5. Partage d'une variable entre les processus fils
    Par Mehdi Feki dans le forum Linux
    Réponses: 7
    Dernier message: 09/01/2005, 13h34

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