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

POSIX C Discussion :

processus fils qui garde la socket du parent ouverte et en LISTEN


Sujet :

POSIX C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut processus fils qui garde la socket du parent ouverte et en LISTEN
    Bonjour,

    Dans mon programme en C, j'appelle un script qui lance un autre programme en mode détaché. Donc ce programme ne quitte pas lorsque mon programme principal se ferme.

    Mon problème c'est que dans mon programme principal j'ouvre une socket et je suis en LISTEN dessus.

    Et j'ai remarqué que mon programme secondaire se retrouve lui aussi en LISTEN sur le même port.
    J'ai simplifié mon programme secondaire et il ne fait rien d'autre qu'une boucle while infinie, et j'ai encore le problème.
    Du coup quand je veux relancer mon programme principal, le bind échoue.

    J'ai essayé de lancer mon script avec "system" ou execvp, et c'est pareil.

    Pouvez vous m'expliquer comme ça se fait, et comment le corriger ?

    merci.

  2. #2
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Pourquoi ne pas lancer ta socket dans ton programme secondaire??

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    car ce n'est pas mon programme secondaire qui est sensé écouter sur la socket.

    Pour éclaircir un peut le fonctionnement :
    programme principal = pA
    programme secondaire = pB

    pA est un serveur, qui ouvre une socket, et traite les messages de cette socket.
    pB est une appli qui fait tout autre chose, et qui doit être lancé a un moment donné par pA.

    pA ouvre la socket, traite des messages, puis lance pB.

    problème :
    pB se retrouve lui aussi en listen sur la socket, ce que je ne veux pas.

  4. #4
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Si pB est lancé à un moment donné par pA, tous les sockets se trouvant dans pA seront visibles par pB. Pourquoi ne pas utiliser un pipe pour les échanges de msg

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    mais je ne veux PAS que la socket soit ouverte dans pB. Car c'est pA qui doit gérer les messages sur cette socket. Ces messages viennent de clients qui se connectent à pA.

    Et je n'ai pas besoin d'échanger de message entre pA et pB.

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Après ton appel à socket() dans pA, fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fcntl(sock, F_SETFL, FD_CLOEXEC);

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    merci, ça marche !

    Par contre seulement avec les fonctions exec et pas "system" (mais c'est bien ce que dit la doc).

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Enfin normalement, system() est supposée faire un fork et un exec, donc...

  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 : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Enfin normalement, system() est supposée faire un fork et un exec, donc...
    Ou se comporter comme si, absolument.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    Dans la doc ils parlent seulement de exec.
    Il m'a semblé qu'avec system ca ne marchait pas, mais j'ai pas poussé mes tests plus loin que ca, donc je n'en suis pas sur.

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Pas de test, la norme est suffisante :
    http://www.opengroup.org/onlinepubs/...ns/system.html
    The environment of the executed command shall be as if a child process were created using fork(), and the child process invoked the sh utility using execl()

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

Discussions similaires

  1. Logiciel word vers PDF qui garde les hyperlien ?
    Par elitost dans le forum Word
    Réponses: 30
    Dernier message: 20/11/2007, 21h30
  2. Executer commande dans un processus fils !
    Par jérôme.D dans le forum POSIX
    Réponses: 6
    Dernier message: 23/11/2006, 22h14
  3. Tuer processus fils
    Par lornak dans le forum POSIX
    Réponses: 7
    Dernier message: 29/05/2006, 10h00
  4. terminaison du processus fils
    Par zahira dans le forum POSIX
    Réponses: 3
    Dernier message: 08/04/2006, 13h35
  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