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

  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 295
    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 295
    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 490
    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 490
    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 295
    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 295
    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 840
    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 840
    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 295
    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 295
    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
    551
    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 : 551
    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

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main( void ){
    	mode_t error = 0;
    	extern int errno;
    	if( 0 != (errno = mkdir("testo", 0777)) )
    T'es sûr que modifier manuellement errno (alors qu'il est déjà modifié par le système en cas de souci dans l'appel de mkdir()) est une bonne idée ? T'as pas peur d'un effet de bord ? Ce serait pas plutôt if( 0 != (error = mkdir("testo", 0777))) ???
    Sinon j'ai bien aimé ton "f_mkdir_deguelasse" parce que c'est vraiment du dégueulasse Mais je ne pense pas qu'il serve car (cela n'a pas été dit explicitement mais ça se laisse sous-entendre) quand c'est possible, les mkdir de chrtophe se font bien. C'est seulement leur valeur retournée qui est bizarre.

    Moi j'ai écrit ce petit code un poil plus simple

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <errno.h>
    #include <stdio.h>
    #include <string.h>
     
    int main( int argc, char *argv[] ){
     
    	int r;
    	extern int errno;
     
     	errno=0;
     	r=mkdir(argv[1], 0777);
     	printf("%d, %d [%s]\n", r, errno, strerror(errno));
    }

    Et je le lance en invoquant soit un truc inexistant (le dossier est alors créé et j'ai au retour 0, 0 [Success]), soit un truc inexistant mais dans un dossier parent qui ne m'est pas accessible (j'ai au retour -1, 13 [Permission denied]), soit un truc déjà existant (et j'ai au retour -1, 17 [File exists]).

    PS: je suis sur une Debian 8 64 bits.
    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]

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 490
    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 490
    Par défaut
    Peux-tu également lancer strace et ltrace sur ton programme d'exemple ?

  9. #9
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 295
    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 295
    Par défaut
    Je voulais le faire mais pas trop le temps pour le moment, je le ferais quand j'aurais un peu de temps, ça m'intrigue ce truc.

    J’utilise cmake pour compiler, ça vient peut-être de ça. Je regarderais.
    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

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 490
    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 490
    Par défaut
    Juste un mot pour dire que le fin mot de l'histoire nous intéresse toujours.
    Essaie aussi ldd sur ton programme pour voir s'il fait appel à des bibliothèques inhabituelles et vérifie aussi si LD_PRELOAD et les autres variables définies dans la man page de ld n'utilisent pas non plus de valeurs particulières (très utilisées au développement et au déboguage pour intercepter les appels aux bibliothèques).

  11. #11
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 295
    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 295
    Par défaut
    J'ai mis de coté pour le moment. Prob. de temps.

    Je ferais un retour.
    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

  12. #12
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 295
    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 295
    Par défaut
    Bonsoir,

    Juste pour signaler la résolution du prob.

    Comme je le soupçonnais, je n'avais pas un bug mais étais le bug.

    Je n'ai pas fait de strace ou de ltrace pour trouver, j'ai juste réécrit le bloc de code (pas beaucoup de lignes donc plus efficace et rapide que de déboguer).

    Je pense que j'ai du laisser trainer des variables de même nom mais de portée différente. Du moins, c'est le 1er truc qui me vient à l'esprit.

    Je rajouterais que je ne programme qu'en amateur et très peu, donc je n'applique pas forcément les bonnes pratiques, et du coup voilà le résultat.
    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

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    j'ai juste réécrit le bloc de code (pas beaucoup de lignes donc plus efficace et rapide que de déboguer).
    Des fois je fais ça aussi. J'ai un truc qui fonctionne, mais je le réécris différemment et il ne fonctionne plus (oubli d'un truc, comme par exemple utilisation du pointeur "av" (avant) alors qu'il aurait fallu utiliser "ap" (après)). Bref plutôt que de chercher où j'ai pu me vautrer, je préfère revenir au truc qui fonctionne puis de nouveau le réécrire. Et là, hop, comme cette fois je ne me suis pas vautré il fonctionne encore. Ca m'est arrivé encore hier après-midi.

    Pense à cliquer sur "resolu".
    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]

+ 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