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 :

fonction mkdir sous Linux - retour anormal


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 260
    Par défaut fonction mkdir sous Linux - retour anormal
    Bonjour,

    J'ai un truc étrange avec la fonction mkdir sous Linux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int retour=mkdir("test",0777);
    me retourne toujours 511 quelque soit le résultat.
    Par contre si je fais un printf de errno le résultat est correct : success si ok, File exists si le dossier existe, Permission denied si j’écris ou j'ai pas le droit.
    Les headers requis par la fontion sont bien mis.

    Merci pour vos lumières
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonjour,

    C'est très étonnant, en effet (et ça marche chez moi). 511 est égal à « -1 » codé sur neuf bits. La man page (sections 2 et 3P, pour l'appel système proprement dit et pour la fonctionnalité POSIX) de mkdir spécifie bien que l'appel répond 0 si tout se passe bien et -1 en cas d'échec.

    Quelle version de Linux utilises-tu (distribution elle-même et version du noyau avec uname -a) ?

    Tout se passe comme si ton appel était « wrappé » à l'intérieur de quelque chose qui en tiendrait lieu et qui ferait faire l'opération par autre chose…

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 260
    Par défaut
    511 est égal à « -1 » codé sur neuf bits.
    J'y ai pensé mais très vite oublié car même en cas de succès, j'ai 511.

    C’est sur une Debian 7 32 bits noyau 3.2.0-4-486.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    As-tu tenté de forcer un échec mkdir ??? Comme par exemple mkdir(".", 0777) ou mkdir("/tmp", 0777) ou même mkdir("/etc/passwd", 0777) pour voir ce que ça sort dans ce cas ???
    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]

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 260
    Par défaut
    Dans tous les cas le retour est de 511. errno retourne par contre la vérité (success, access denied, already exits selon la situation).

    Je pense plus avoir généré un bug qu'en avoir découvert un mais quelque chose m’échappe.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir,
    Effectivement, c'est bizarre: soit mkdir est éventuellement wrappé comme le motionne @Obsidian, soit c'est une question de masque et je penche plutôt pour la seconde option. Il ne faut pas l'oublier que tout appel système de mkdir permet de créer un répertoire certes, mais le mode employé est tout de même transmis à umask puisqu'elle apparaît comme le genre O_CREAT ou autre.

    De plus à titre d'information, tous les utilisateurs GNU/Linux ou Unix reçoivent à la connexion de leur session un masque de création de mode de fichier par défaut qui normalement est sur la plus par des systèmes Unix, GNU/Linux et Mac Os 22 en octal (ou 18 en décimale). Votre Shell possède lui aussi son umask (c'est une commande intégrée) et les raisons de cette commande intégrée est légitime puisque si l'on crée un répertoire ou fichier, on héritera du mode de création du processus fils donc un masque unique à chaque processus, bref sans trop m'avancer dans les détails et trop m'avancer dans une solution qui pourrais être hors sujet essayez les méthodes suivantes:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    int main( void ){
     
    	mode_t error = 0;
    	extern int errno;
     
    	errno = 0;
    	error = umask(0);
     
    	(void)fprintf(stderr, 
    		"Verif Masq\t%o\n", error );
     
    	if( 0 != mkdir("testo", 0777)) )
    		(void)fprintf(stderr, "(%d)\t:%s\n",
    			errno, strerror(errno) );
     
    	(void)fprintf(stderr, "Ok\n" );
     
    	error = umask(0);
    	(void)fprintf(stderr, 
    		"Verif Masq\t%o\n", error );
     
    	return EXIT_SUCCESS;
    }

    Ou les méthodes peu catholiques suivantes si vraiment ça ne passe pas:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // que en root
    int f_mkdir_root_user( const char *path ){
    	return mknod(path, S_IFDIR|0777, 0);
    }
     
    //
    int f_mkdir_deguelasse( const char *path ){
    	char _cmd[BUFSIZ];
    	(void)memset_s(_cmd, BUFSIZ, 0, 0);
    	(void)sprintf(_cmd, "mkdir %s", path );
    	return ( (0 == system(_cmd)) ? 0 : (-1) );
    }

    à bientôt

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

Discussions similaires

  1. soucis avec la fonction sleep() sous linux
    Par TriPlank12 dans le forum Linux
    Réponses: 1
    Dernier message: 07/11/2009, 18h54
  2. Réponses: 7
    Dernier message: 20/07/2007, 14h48
  3. fonction sleep() en C sous Linux
    Par makohsarah dans le forum POSIX
    Réponses: 5
    Dernier message: 05/06/2006, 15h06
  4. fonction itoa sous linux
    Par skoukni_brahim dans le forum C
    Réponses: 5
    Dernier message: 20/03/2006, 17h40
  5. fonction "inb" sous linux; port parallele
    Par be_net dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 09/06/2004, 11h39

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