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 :

fonctions open et write


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 17
    Points
    17
    Par défaut fonctions open et write
    Bonjour à tous,

    Je n'arrive pas à bien me servir des fonctions write et open. J'ai créé le tout petit programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <unistd.h>
    #include <fcntl.h>
     
    int main()
    {
       int fd;
       char c = 'z';
     
       fd = open("./test",O_CREAT, 777);
       write(fd, &c, 1);
       return (0);
    }
    Je veux créer le fichier test et juste écrire 'z' dedans, mais ça ne marche pas. J'ai mis 777 comme paramètre à open, comme signalé dans le manuel pour donner tous les droits à tous le monde. Lorsque j'exécute le programme, le fichier test est bien créé mais vide. De plus, lorsque je regarde les droits du fichier, j'ai :
    -r----x--x 1 gautgaut 2014 0 Nov 4 17:04 test
    (je suis sur mac OS). J'ai bien essayer d'utiliser l'option O_WRONLY, mais sans rigueur ni succès.

    L'un de vous a-t-il une explication ? Merci d'avance,

    Gautier

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Si jai bien compris la documentation le mode ne s'écrit pas en base octale. Il faut utiliser les constantes de la bibliothèque.

    Extrait :
    O_CREAT

    Créer le fichier s'il n'existe pas. Le possesseur (UID) du fichier est renseigné avec l'UID effectif du processus. Le groupe propriétaire (GID) du fichier est le GID effectif du processus ou le GID du répertoire parent (ceci dépend du système de fichiers, des options de montage, du mode du répertoire parent, etc.). Voir par exemple les options de montage bsdgroups et sysvgroups décrites dans la page mount(8)).

    mode indique les permissions à utiliser si un nouveau fichier est créé. Cet argument doit être fourni lorsque O_CREAT est spécifié dans flags ; si O_CREAT n'est pas spécifié, mode est ignoré. Les permissions effectives sont modifiées par l'umask du processus de manière classique : les permissions du fichier créé sont (mode & ~umask). Veuillez noter que ce mode ne s'applique qu'aux accès ultérieurs au fichier nouvellement créé. L'appel open() qui crée un fichier dont le mode est en lecture seule fournira quand même un descripteur de fichier en lecture et écriture.

    Les constantes symboliques suivantes sont disponibles pour mode :

    S_IRWXU
    00700 L'utilisateur (propriétaire du fichier) a les autorisations de lecture, écriture, exécution.
    S_IRUSR
    00400 L'utilisateur a l'autorisation de lecture.
    S_IWUSR
    00200 L'utilisateur a l'autorisation d'écriture.
    S_IXUSR
    00100 L'utilisateur a l'autorisation d'exécution.
    S_IRWXG
    00070 Le groupe a les autorisations de lecture, écriture, exécution.
    S_IRGRP
    00040 Le groupe a l'autorisation de lecture.
    S_IWGRP
    00020 Le groupe a l'autorisation d'écriture.
    S_IXGRP
    00010 Le groupe a l'autorisation d'exécution.
    S_IRWXO
    00007 Tout le monde a les autorisations de lecture, écriture, exécution.
    S_IROTH
    00004 Tout le monde a l'autorisation de lecture.
    S_IWOTH
    00002 Tout le monde a l'autorisation d'écriture.
    S_IXOTH
    00001 Tout le monde a l'autorisation d'exécution.
    [edit1]
    Au passage que renvoie la fonction write(); ?

    [edit2]
    Pendant que j'y suis open(); et write(); peuvent indiquer un problème via la variable errno. Pour l'utiliser c'est par ici .

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Normalement il te faut les deux.
    De plus, il ne faut pas oublier de fermer le fichier, dans les cas où c'est bufferisé ça assure de ne pas quitter le programme avant que le contenu des buffers ait été écrit sur le disque.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <unistd.h>
    #include <fcntl.h>
     
    int main()
    {
       int fd;
       char c = 'z';
     
       fd = open("./test",O_CREAT|O_WRONLY, 0777);
       write(fd, &c, 1);
       close(fd);
       return (0);
    }
    PS: Une valeur en octal doit être introduite par un zéro, sinon elle n'est pas considérée comme étant en octal.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2013
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Merci Gerald, open me donnait 3 comme file descriptor, errno risque de bien me servir.

    Merci Medinoc, ça marche nickel maintenant !

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

Discussions similaires

  1. [BO XIR2][VB.NET] Fonction Open Document
    Par ecayuno dans le forum SDK
    Réponses: 11
    Dernier message: 18/04/2008, 17h27
  2. Retour fonction open
    Par viscere dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/08/2007, 16h09
  3. Fonction Open Recordset
    Par delcroixf dans le forum Access
    Réponses: 4
    Dernier message: 12/01/2007, 13h46
  4. pb fonction open...
    Par renaudjuif dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2006, 17h17
  5. [VBA/Excel] Fonction open sous Excel 97
    Par nico01984 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/01/2006, 14h19

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