Forum Programmation.c comment faire un appel à system() sans que le processus hérite des filedescriptors

Posté par .
Tags : aucun
0
21
sept.
2007
J'ai un code C qui fait

system("ssh machine programme &");

Mais le processus ssh hérite des filedescripteurs de l'appli.

j'aimerai qu'il n'hérite de rien.

j'ai trouvé peut-être une solution:
a base de: (pseudo code)

if (fork()==0) {

for (fd=0;fd<maxfd;fd++) {
close(fd);
}
system("ssh......");
}

je ne suis pas fier de mon truc.

avez-vous une meilleure idée ?

merci...
  • # Non.

    Posté par . Évalué à 2.

    Cela me semble correct, excepté que fermer les entrées et sorties standard n'est peut-être pas souhaitable. Si tu veux faire plus propre il existe unshare mais c'est Linux-specific ...
  • # non c'est bon.

    Posté par . Évalué à 3.

    C'est la manière de faire standard unix, je dirais.

    C'est en utilisant un truc semblable que fonctionne les pipes et les redirections de fichiers.

    "La première sécurité est la liberté"

    • [^] # Re: non c'est bon.

      Posté par . Évalué à 1.

      merci de votre aide,

      malheureusement mon idée ne semble pas marcher:

      mon appli initiale faisait:

      1) ouvre_sockets();
      2) system("ssh machine programme&");
      3) travaille_sur_les_sockets();

      maintenant, avec mon bidule en plus:

      1) ouvre_sockets();
      2) if (fork()==0) {
      for (fd=0;fd<maxfd;fd++) close(fd);
      system("ssh......&");
      exit(0);
      }
      3) travaille_sur_les_sockets();

      et le gros problème c'est que maintenant travaille_sur_les_sockets() (dans le corps du pere) cartonne en me disant que mes sockets sont perdues.

      Avez-vous mieux à proposer ?

      Merci d'avance.
      • [^] # Re: non c'est bon.

        Posté par . Évalué à 1.

        Il me semble que les sockets sont des filedescripteur
        Il faut donc que dans ton for tu mettes une condition pour ne pas fermer tes sockets.


        ou utiliser ouvre_sockets() apres la fermeture, si tu peux.
        • [^] # Re: non c'est bon.

          Posté par . Évalué à 1.

          L'objectif c'était que le process fils n'hérite de rien (ni les fichiers, ni les sockets). Après fork, on ne peut pas ré-établir toutes les connections puisqu'on a perdu l'historique.

          En fait la bonne solution c'est mettre le flag close-on-exec sur les filedescripteurs. avec fnctl.... ça marche maintenant.

          merci!

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.