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 :

Linux et file descriptors : comment rendre processus fils indépendant ?


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Linux et file descriptors : comment rendre processus fils indépendant ?
    Bonjour à tous,
    je me casse la tête depuis un moment sur cette enigme de programmation linuxienne. Toute aide me serait la bienvenue.

    J'ai un premier programme A qui souhaite appeler/lancer un programme B. Je n'ai pas trouvé d'autres moyens que d'utiliser un fork() puis execv() avec le nom de mon programme B. Jusqu'ici tout vas bien.

    Mon soucis est que lors de l'appel de fork(), le processus fils 'hérite' de tous les file descriptors du père. Je souhaiterai savoir si vous connaissez un appel qui empècherait cet 'héritage'. Ou un moyens de supprimer ces références (tout en les conservant dans le père).

    Car lors de la terminaison du programme père, le fils continue de garder les file descriptors ouvert.

    Merci d'avance pour votre aide et bonnes fêtes à tous !

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 732
    Points : 31 056
    Points
    31 056
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Glenou Voir le message
    Bonjour à tous,
    je me casse la tête depuis un moment sur cette enigme de programmation linuxienne. Toute aide me serait la bienvenue.

    J'ai un premier programme A qui souhaite appeler/lancer un programme B. Je n'ai pas trouvé d'autres moyens que d'utiliser un fork() puis execv() avec le nom de mon programme B. Jusqu'ici tout vas bien.

    Mon soucis est que lors de l'appel de fork(), le processus fils 'hérite' de tous les file descriptors du père. Je souhaiterai savoir si vous connaissez un appel qui empècherait cet 'héritage'. Ou un moyens de supprimer ces références (tout en les conservant dans le père).

    Car lors de la terminaison du programme père, le fils continue de garder les file descriptors ouvert.

    Merci d'avance pour votre aide et bonnes fêtes à tous !
    Salut
    C'est normal que le fils hérite d'une copie des valeurs du père car c'est la base de la programmation parallèle sur Unix
    Tu as les solutions de
    1) fermer dans le fils les descripteurs ouverts dont il hérite
    2) appeler le fork avant que les descripteurs aient été ouverts

    Perso, je choisirais la 2 mais bon, ceci ne concerne que moi...

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci pour cette réponse,
    c'est ce à quoi je m'attendais.

    Il n'y a donc aucun moyen d'appler un processus en dehors de la relation père/fils (sans utiliser de fork()) ?

    Je ne peux malheureusement pas utiliser la seconde solution.
    Les files descriptors dont je parle, sont ceux associé aux socket.
    Le processus A ouvre des socket en listen, sur ces sockets des messages sont échangés et parmis ces messages, l'un doit engendrer l'appel du processus B.
    Je me retrouve avec des sockets en Listen ouvert par A. Et lorsque je lance B et que je termine A, ces sockets restent ouvertes.

    Pour la première solution, je dois donc fermer tous les files descriptors.
    Par un for(i=3,i<nbFd,i++) close(i); En évitant de fermer les fd 0,1 et 2 ?

    Sinon j'ai trouvé un moyen de résoudre mon probleme sur les sockets avec l'attribut close_on_exe sur les fd. Seulement je ne me suis pas assez penché sur son utilisation. Je me demande si cet attribut est aussi transmis lors du fork(), dans ce cas lors que le fils se termine il fermera ce fd ?

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Deux choses :

    1) Pour les fd 0, 1 et 2, à part si tu es sûr que le process que tu exec() ne les utilisera jamais, tu ne peux pas te contenter de les fermer. Il faut plutôt ouvrir /dev/null et faire un dup2() pour chacun d'eux.

    2) close_on_exe est effectivement une solution pour les autres fd. L'attribut est transmis lors du fork(). Les fd marqués close_on_exec sont fermé au moment du exec() comme son nom l'indique, pas quand le processus termine.

Discussions similaires

  1. Réponses: 15
    Dernier message: 30/05/2009, 13h53
  2. Comment créer un processus fils?
    Par Linkin dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 11/04/2008, 13h27
  3. Réponses: 7
    Dernier message: 21/01/2007, 21h47
  4. Réponses: 2
    Dernier message: 15/11/2006, 10h38
  5. Comment rendre intuable un processus ?
    Par touff5 dans le forum Administration système
    Réponses: 18
    Dernier message: 26/09/2006, 17h58

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