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

Linux Discussion :

Récupérer un nom de fichier à partir d'un descripteur


Sujet :

Linux

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut Récupérer un nom de fichier à partir d'un descripteur
    Bonjour,
    Dans un programme en C.
    Je voudrais savoir si l'on peut récupérer le nom d'un fichier temporaire à partir du descripteur de fichier que me renvoie la fonction qui crée le fichier temporaire ?
    Le descripteur que la fonction me renvoie est un int je voudrais pouvoir récupérer le nom du fichier pour faire un unlink depuis le main et non depuis la fonction qui crée le fichier. Je vous donne la déclaration de la fonction :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef int handle_temp;
     
    handle_temp ecrire_temp (char * buffer, size_t length)

    Je pourrais faire en sorte qu'elle me renvoie le nom du fichier mais je n'aurais plus le descripteur et je ne pourrais plus utiliser l'appel read.

    si quelqu'un a une idée merci d'avance...

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PyNub Voir le message
    Bonjour,
    Dans un programme en C.
    Je voudrais savoir si l'on peut récupérer le nom d'un fichier temporaire à partir du descripteur de fichier que me renvoie la fonction qui crée le fichier temporaire ?
    Le descripteur que la fonction me renvoie est un int je voudrais pouvoir récupérer le nom du fichier pour faire un unlink depuis le main et non depuis la fonction qui crée le fichier. Je vous donne la déclaration de la fonction :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef int handle_temp;
     
    handle_temp ecrire_temp (char * buffer, size_t length)

    Bonjour
    Non tu ne peux pas récupérer un nom depuis un descripteur. Parce que, théoriquement, le descripteur est créé depuis un nom et que tu es sensé déjà avoir ce nom.

    Citation Envoyé par PyNub Voir le message
    Je pourrais faire en sorte qu'elle me renvoie le nom du fichier mais je n'aurais plus le descripteur et je ne pourrais plus utiliser l'appel read.
    Ben si tu récupères le nom en question de la fonction (étonnant quand-même que tu ne l'aies pas) te suffit de le passer à open() et tu récupèreras un descripteur pour ton read()...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre Expert
    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
    Par défaut
    Tu peux aussi modifier ecrire_temp() pour qu'elle te renvoies à la fois le nom du fichier et son fd.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Citation Envoyé par matafan Voir le message
    Tu peux aussi modifier ecrire_temp() pour qu'elle te renvoies à la fois le nom du fichier et son fd.
    Oui avec un tableau de chaîne ou une structure en effet...

    Comme je me demandais justement si j'étais obligé de faire renvoyer le nom par la fontion et si il n'existait pas "quelquechose" pour faire apparaître le nom j'ai vu stat() mais je ne sais pas comment marche cet appel système.

    Comme je n'avais pas envie de refaire la fonction j'ai créer un char * global et j'écris à l'intérieur avec un strdump(). (je ne sais plus si c'est le bon orthographe). Je sais que ce n'est pas bien... Je vais revoir ça...

    @svaer
    Parce que, théoriquement, le descripteur est créé depuis un nom et que tu es sensé déjà avoir ce nom.
    Justement non la fonction ecrire_temp crée un fichier temporaire avec un nom unique aléatoire et renvoie un descripteur de fichier...

    Merci à vous deux.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PyNub Voir le message
    Oui avec un tableau de chaîne ou une structure en effet...

    Comme je me demandais justement si j'étais obligé de faire renvoyer le nom par la fontion et si il n'existait pas "quelquechose" pour faire apparaître le nom j'ai vu stat() mais je ne sais pas comment marche cet appel système.
    stat prend en paramètre un nom de fichier et te remplit une structure avec toutes les infos du fichier (taille, type et droits, uid, gid, etc). Tout sauf le nom. En fait, le nom d'un fichier ne lui est jamais directement lié. Le nom d'un fichier n'est qu'une entrée dans un répertoire, entrée associée à l'inode du fichier. Ainsi un nom peut très bien changer sans que le fichier ne change. C'est aussi pour ça que l'effacement d'un fichier ne dépend que des droits du répertoire et non du fichier lui-même (tu peux très bien effacer un fichier ayant des droits en 000). Bref dans Unix, les noms sont totalement décorellés des fichiers.

    Citation Envoyé par PyNub Voir le message
    Justement non la fonction ecrire_temp crée un fichier temporaire avec un nom unique aléatoire et renvoie un descripteur de fichier...
    Il y a d'autres fonctions plus subtiles comme tempnam(). Cette fonction te renvoie un nom unique. Ensuite, tu peux faire open(nom) pour avoir un descripteur => tu as donc à la fois le nom et le descripteur...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    L'auteur du livre que je suis en train de lire dit aussi qu'il existe d'autres solutions pour créer un fichier temporaire, cependant il ajoute que celles-ci sont moins fiable...

    Existe-t-il une traduction du manuel de unistd.h ? Je voudrais avoir une doc si possible en français (ou en anglais...) autre que celle diponible dans le shell j'ai trouvé quelques sites qui fournissent une copie de man unistd.h mais peut-être existe-t-il une doc plus "friendly" ?

  7. #7
    Membre Expert
    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
    Par défaut
    Ce n'est pas moins sûr, à condition de bien créer le fichier avec les flags O_CREAT et O_EXCL. C'est le O_EXCL qui est important pour s'assurer que le fichier n'existe pas déjà.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PyNub Voir le message
    L'auteur du livre que je suis en train de lire dit aussi qu'il existe d'autres solutions pour créer un fichier temporaire, cependant il ajoute que celles-ci sont moins fiable...
    Tout dépend de la criticité de ton "fichier temporaire".
    Souhaites-tu
    1) obtenir un nom unique même si ce nom correspond à un ancien fichier inutilisé qui peut être donc sacrifié
    2) obtenir un fichier dont tu sois sûr de sa non-existence au moment de l'appel

    Si c'est 1, alors te suffit d'inclure getpid() dans le nom. Un pid étant unique à un instant "t", tu es certain que le nom résultant est unique. Mais peut-être qu'il reste sur ta machine un ancien fichier avec le même nom (issu d'une exécution précédente). Ou qu'un autre processus a accidentellement créé un fichier portant le même nom. En effet, si ton pid est 123 mais qu'un autre programme a créé le fichier "123" (nom en dur dans le code) tu te retrouves avec une collision...

    Si c'est 2, alors partir sur des fonctions comme tempnam() ou autres

    Accessoirement, penser aussi au répertoire d'accueil. Si tu crées tes fichiers dans $HOME/tmp t'as moins de chance d'avoir une collision que si tu travailles dans /tmp...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre Expert
    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
    Par défaut
    Attention quand même, le problème des collisions dans le nom des fichiers temporaire ce n'est pas seulement que tu peux écraser un vieux fichier, c'est aussi une faille de sécurité.

    Imagine que quelqu'un de mal intentionné "devine" à l'avance le nom de ton fichier temporaire. Il créé un lien symbolique portant ce nom, et pointant vers un fichier auquel il n'a normalement pas accès. Si une personne ayant accès au fichier cible exécute le programme fautif, il écrira dans le lien symbolique, ce qui aura pour effet d'écraser la cible. Ainsi un utilisateur non privilégié pourrait forcer root à aller effacer /etc/passwd par exemple.

    C'est pour cela qu'il faut soit utiliser des fonctions toutes faites qui créés elles même le fichier temporaire (mkstemp), soit, si on utilise une fonction qui génère un nom de fichier unique sans créer le fichier, faire la création en mode exclusif (O_EXCL). Sinon quelqu'un pourrait créer le fichier entre le moment où le nom unique est généré, et le moment où open(O_CREAT) est appelé.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Citation Envoyé par matafan Voir le message
    C'est pour cela qu'il faut soit utiliser des fonctions toutes faites qui créés elles même le fichier temporaire (mkstemp), soit, si on utilise une fonction qui génère un nom de fichier unique sans créer le fichier, faire la création en mode exclusif (O_EXCL). Sinon quelqu'un pourrait créer le fichier entre le moment où le nom unique est généré, et le moment où open(O_CREAT) est appelé.
    Pour générer des nom de fichier unique il faudrait utiliser des fonctions de génération de nombre pseudo-aléatoire, je ne sais pas le faire... mkstemp est pratique pour ça. Je note le mode exclusif par contre je ne sais pas ce que fait O_CREAT je vais me renseigner...
    Merci pour les infos

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    c'est 1, alors te suffit d'inclure getpid() dans le nom. Un pid étant unique à un instant "t", tu es certain que le nom résultant est unique. Mais peut-être qu'il reste sur ta machine un ancien fichier avec le même nom (issu d'une exécution précédente)....
    Le pid ...je n'y avais pas pensé en effet...


    Si c'est 2, alors partir sur des fonctions comme tempnam() ou autres
    Justement c'est cette fonction qui ne serait pas fiable voir ici

    Merci !

  12. #12
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Salut,

    Il y a une nouveauté depuis le noyau 2.6.39 qui semble correspondre à ce que tu cherches.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Citation Envoyé par monnomamoi Voir le message
    Salut,

    Il y a une nouveauté depuis le noyau 2.6.39 qui semble correspondre à ce que tu cherches.
    En effet merci beaucoup pour l'info je vais regarder ça de près ...
    Si je comprends bien il faut recompiler le noyau

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PyNub Voir le message
    par contre je ne sais pas ce que fait O_CREAT je vais me renseigner...
    C'est un des flags possibles de open
    • O_CREAT => si le fichier n'existe pas il est créé. Sans ce flag, si le fichier n'existe pas open() échoue et te renvoie -1 et errno est positionné
    • O_EXCL => mode exclusif (un peu l'inverse de O_CREAT) => si le fichier existe, open() échoue et renvoie -1 et errno est positionné. Sans ce flag, si le fichier existe déjà, il est écrasé
    • O_APPEND => ouvert pour être écrit en fin de fichier
    • O_TRUNC => si le fichier existe, il est tronqué
    • O_RDONLY => ouvert pour être lu
    • O_WRONLY => ouvert pour être écrit
    • O_RDWR => ouvert pour être indifféremment lu ou écrit


    Le positionnement de ces flags se fait via un "ou bit à bit" => open("toto", O_CREAT|O_EXCL|O_WRONLY). Chacun de ces flags correspondant à une puissance de 2 (1, 2, 4, 8, ...), il correspond à un bit placé en position 1, 2, 4, 8,... que la fonction peut récupérer via un masque
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    [*]O_TRUNC => si le fichier existe, il est tronqué
    ça veut dire quoi exactement tronqué ?

    Le positionnement de ces flags se fait via un "ou bit à bit" => open("toto", O_CREAT|O_EXCL|O_WRONLY). Chacun de ces flags correspondant à une puissance de 2 (1, 2, 4, 8, ...), il correspond à un bit placé en position 1, 2, 4, 8,... que la fonction peut récupérer via un masque
    On peut utiliser des entiers pour positionner les flags (comme dans chmod) ou les macros seulement ?

    Merci !

  16. #16
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PyNub Voir le message
    ça veut dire quoi exactement tronqué ?
    La totalité de son contenu est effacé


    Citation Envoyé par PyNub Voir le message
    On peut utiliser des entiers pour positionner les flags (comme dans chmod) ou les macros seulement ?
    Les macros c'est plus portable et plus pérenne. Si demain les développeurs décident que O_CREAT n'est plus 0x0020 mais 0x0400, tu n'as pas besoin de modifier ton code.

    A noter que la primitive chmod() demande aussi l'utilisation de macros
    - S_IRUSR => read user
    - S_IWUSR => write user
    - S_IXUSR => exec user
    - éventuellement S_IRWXU qui est l'association des 3 précédentes

    - S_IRGRP => read group
    - S_IWGRP => write group
    - S_IXGRP => exec group
    - éventuellement S_IRWXG qui est l'association des 3 précédentes

    - S_IROTH => read other
    - S_IWOTH => write other
    - S_IXOTH => exec other
    - éventuellement S_IRWXO qui est l'association des 3 précédentes

    - S_ISUID => setuid
    - S_ISGID => setgid
    - S_ISVTX => sticky bit

    Donc si tu veux positionner par exemple les droits en -rwsr-xr-T, la norme voudrait que tu appeles
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    chmod(fichier, S_ISUID | S_ISVTX | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH)
    ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Les macros c'est plus portable et plus pérenne. Si demain les développeurs décident que O_CREAT n'est plus 0x0020 mais 0x0400, tu n'as pas besoin de modifier ton code.
    Ok c'est noté

    merci pour toutes ces macros

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

Discussions similaires

  1. [Batch] Récupérer le nom du fichier sans l'extension à partir du chemin complet
    Par mathieu_r dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 29/07/2014, 12h10
  2. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  3. récupérer un nom de fichier à partir de FileChooser
    Par adel.87 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 29/01/2008, 17h55
  4. Récupérer le nom du fichier spool correspondant à un job
    Par chtiot dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 23/02/2004, 20h28
  5. Réponses: 2
    Dernier message: 29/01/2004, 11h05

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