Forum Programmation.c++ Chmod +x dans un programme C++

Posté par  .
Étiquettes : aucune
0
18
mar.
2010
J'ai un programme C++ qui extrait divers parametres, et qui les utilise pour ecrire un script shell lancant d'autre programmes.

Question bete, Y a t'il un option pour faire chmod +x a la creation d'un ofstream ou bien il faut que je fasse un truc moche genre system("chmod +x monscript.sh");
  • # umask

    Posté par  . Évalué à 3.

    Ca fait longtemps que je n'ai pas joué a ce petit jeu, mais pour moi il faut jouer avec le umask.

    Par contre je ne crois pas qu'il y aie une API dans la libstdc++ pour ça, il te reste cependant la libc.
  • # chmod()

    Posté par  . Évalué à 8.

    • [^] # Re: chmod()

      Posté par  (site web personnel) . Évalué à 4.

      oui, je crois que c'est le plus simple : tu crées le fichier, tu le remplis, tu le fermes, et tu mets les bons droits ensuite.

      Les meilleurs outils *nix font pareil, comme rsync par exemple, sauf que lui en plus il génère un fichier temporaire et le renomme au dernier moment.
      • [^] # Re: chmod()

        Posté par  . Évalué à 3.

        Il vaut mieux utiliser fchmod, en lui passant le file descriptor derrière le stream (man fileno). Parce que si tu fermes le fichier et changes les droits, il y a une race, surtout que le fichier est rendu exécutable (et probablement exécuté peu de temps après)...
        • [^] # Re: chmod()

          Posté par  . Évalué à 2.

          On ne peut pas obtenir un file descriptor ou FILE* depuis un fstream.
          • [^] # Re: chmod()

            Posté par  . Évalué à 4.

            Le mieux c'est d'utiliser Boost.Iostreams qui simplifie pas mal de choses par rapport à iostream et permet entre autre de construire un flux à partir d'un descripteur de fichier (Cf file_descriptor).
      • [^] # Re: chmod()

        Posté par  . Évalué à 1.

        Si l'on veut être puriste, le plus propre consiste à spécifier les droits à attribuer dès la création du fichier (possible avec open() ), quitte à omettre volontairement le flag x durant le remplissage du fichier, et l'ajouter à la fin.

        C'est ce que je ferais sur un fichier qui a vocation à devenir exécutable.
    • [^] # Re: chmod()

      Posté par  . Évalué à 1.

      Comment se fait-il que chmod() se retrouve dans la section 3 ? Il me semblait que c'était un appel système. Sur ma machine (Fedora 9), les man pages le classent bien dans la section 2.
      • [^] # Re: chmod()

        Posté par  . Évalué à 1.

        Chez moi, il est dans la section 2: ça doit être une erreur, donc:

        man 2 chmod
      • [^] # Re: chmod()

        Posté par  . Évalué à 3.

        Tu as raison, chmod est un appel système et est classé dans la section 2 mais la page présentée provient du manuel posix:
        man 2 chmod ===> page man linux
        man 3p chmox ===> page man posix de l'openGroup // disponible sous Fedora

        Pour la portabilité, c'est intéressant d'avoir les pages du manuel posix, suffit juste de rajouter un p derrière le numéro de section pour y accèder.
        Posix n'oblige pas les implémenteurs à implémenter son API sous forme d'appels systèmes donc les pages du manuel posix vivent dans la section 1 (commandes utilisateur), 3 (libc) et 0 pour les headers.
        • [^] # Re: chmod()

          Posté par  . Évalué à 1.

          Et bien, je ne connaissais pas du tout cette section, et c'était une lacune…

          Merci beaucoup pour l'info !

Suivre le flux des commentaires

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