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 :

Connaitre le point de montage d'un fichier en C


Sujet :

Linux

  1. #1
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut Connaitre le point de montage d'un fichier en C
    Bonjour,

    En utilisant les function stat() ou statfs() on peut obtenir facilement les informations d'un disque tel que l'espace libre ou son ID en donnant un fichier.

    Cependant je n'arrive pas a trouver une façon d'obtenir le point de montage a partir de l'ID du disque. Quelle fonction dois-je utiliser????

    merci.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Faut taper dans le fichier "/etc/fstab" ou "/etc/mtab"
    Le premier donne les ordres de montage automatisés lors du démarrage et le second donne les montages en cours.
    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 émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par elraton Voir le message
    Bonjour,

    En utilisant les function stat() ou statfs() on peut obtenir facilement les informations d'un disque tel que l'espace libre ou son ID en donnant un fichier.

    Cependant je n'arrive pas a trouver une façon d'obtenir le point de montage a partir de l'ID du disque. Quelle fonction dois-je utiliser????

    merci.
    Qu'appelles tu l'ID du disque? sois précis s'il te plaît.

    Citation Envoyé par Sve@r Voir le message
    Faut taper dans le fichier "/etc/fstab" ou "/etc/mtab"
    Sauvage!
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  4. #4
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut
    Bein l'ID du disque se sont le nombre que me renvois stat() ou statvfs()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <sys/stat.h>
    #include <sys/statvfs.h>
     
    stat.st_dev /* ID of device containing file */
    stvfs.f_fsid /* file system ID */
    Selon http://linux.die.net/man/2/stat et http://linux.die.net/man/2/statvfs

    Sinon bein visiblement il y a un moyen de lire les point de montage facilement depuis /etc/mtab ou depuis /proc/mount en utilisant les fonctions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <mntent.h>
     
    struct mntent *me;
    mntfp = setmntent( "/etc/mtab", "r" );
    while((me = getmntent(mntfp)) != NULL)
    {
        printf("mnt_fsname: %s,mnt_dir: %s, mnt_type:%s\n",
    me->mnt_fsname,
    me->mnt_dir,
    me->mnt_type);
    }
    endmntent(mntfp);
    J'ai trouver ca en regardant la librairie qt extended pour les linux embedded.

    http://git.openmoko.org/?p=qtopia.gi...c5a102;hb=HEAD

    Apres je ne sais pas vraiment a qui correspond les stat.st_dev et stvfs.f_fsid
    et si il y a un moyen plus facile de les faire correspondre a un point de montage.

  5. #5
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par elraton Voir le message
    Sinon bein visiblement il y a un moyen de lire les point de montage facilement depuis /etc/mtab ou depuis /proc/mount en utilisant les fonctions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <mntent.h>
     
    struct mntent *me;
    mntfp = setmntent( "/etc/mtab", "r" );
    while((me = getmntent(mntfp)) != NULL)
    {
        printf("mnt_fsname: %s,mnt_dir: %s, mnt_type:%s\n",
    me->mnt_fsname,
    me->mnt_dir,
    me->mnt_type);
    }
    endmntent(mntfp);
    oui, c'est pour cela que j'ai dit à Sve@r "sauvage".
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    A ce propose, prend l'habitude dès maintenant d'utiliser la version thread safe de getmntent(), à savoir getmntent_r().
    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  7. #7
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut
    Okay cool pour l'info, par contre je suis pas sur au niveau de la taille de buflen????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	int buflen=500;
    	char buf[buflen];
    	struct mntent mntbuf;
    	struct mntent mnt;
    	FILE* mntfp = setmntent( "/etc/mtab", "r" );
    	while((mnt = getmntent_r(mntfp,&mntbuf,&buf,buflen)) != NULL)
    {
    ...
    }
    ---

    Autre question: c'est quoi la difference entre stvfs.f_fsid et st.st_dev? Qu'elle est le meilleur a utiliser?

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par elraton Voir le message
    Okay cool pour l'info, par contre je suis pas sur au niveau de la taille de buflen????
    Rien de standard, les lignes ne dépassent généralement pas 80 caractères, la glibc utilise en interne 4096 caractères ce qui est bien plus que suffisant.

    Citation Envoyé par elraton Voir le message
    Autre question: c'est quoi la difference entre stvfs.f_fsid et st.st_dev?
    rien en commun:
    Citation Envoyé par statfs
    Nobody knows what f_fsid is supposed to contain (but see below).
    ...
    The f_fsid field
    Solaris, Irix and POSIX have a system call statvfs(2) that returns a struct
    statvfs (defined in <sys/statvfs.h>) containing an unsigned long f_fsid.
    Linux, SunOS, HP-UX, 4.4BSD have a system call statfs() that returns a struct
    statfs (defined in <sys/vfs.h>) containing a fsid_t f_fsid, where fsid_t is
    defined as struct { int val[2]; }. The same holds for FreeBSD, except that it
    uses the include file <sys/mount.h>.

    The general idea is that f_fsid contains some random stuff such that the pair
    (f_fsid,ino) uniquely determines a file. Some OSes use (a variation on) the
    device number, or the device number combined with the file-system type.
    Several OSes restrict giving out the f_fsid field to the superuser only (and
    zero it for unprivileged users), because this field is used in the filehandle
    of the file system when NFS-exported, and giving it out is a security concern.

    Under some OSes the fsid can be used as second argument to the sysfs() system
    call.
    Citation Envoyé par stat
    The st_dev field describes the device on which this file resides. (The
    major(3) and minor(3) macros may be useful to decompose the device ID in this
    field.)
    Citation Envoyé par makedev
    A device ID consists of two parts: a major ID, identifying the class of the
    device, and a minor ID, identifying a specific instance of a device in that
    class. A device ID is represented using the type dev_t.

    Given major and minor device IDs, makedev() combines these to produce a device
    ID, returned as the function result. This device ID can be given to mknod(2),
    for example.

    The major() and minor() functions perform the converse task: given a device
    ID, they return, respectively, the major and minor components. These macros
    can be useful to, for example, decompose the device IDs in the structure
    returned by stat(2).
    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  9. #9
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut
    Okay visiblement le stvfs.f_fs ne marche pas super pour les NTFS en normal user (fs_id=0x0) je pense que c'est ce qu'il raconte sur les raisons de securité.
    je vais donc utiliser le st.st_id!

    Encore une derniere petite question:

    J'obtient bcp de point de montage, est-ce qu'il y a un moyen de savoir si ce sont des disk???Avec le type ca peut marcher mais c'est trop difficile a distinguer (ext2, etx3, etx4, vfat, fuseblk (NTFS))

    Code : 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
     
    FileSystemInfo("/sys", "space 0.00/0.00 GiB (nan%), ID=0x0", mnt="/sys", type="sysfs" 
    FileSystemInfo("/proc", "space 0.00/0.00 GiB (nan%), ID=0x3", mnt="/proc", type="proc" 
    FileSystemInfo("/sys/kernel/debug", "space 0.00/0.00 GiB (nan%), ID=0x5", mnt="/sys/kernel/debug", type="debugfs" 
    FileSystemInfo("/sys/kernel/security", "space 0.00/0.00 GiB (nan%), ID=0x8", mnt="/sys/kernel/security", type="securityfs" 
    FileSystemInfo("/media/6D38-8517", "space 1.82/1.83 GiB (99.56%), ID=0x821", mnt="/media/6D38-8517", type="vfat" 
    FileSystemInfo("/dev/pts", "space 0.00/0.00 GiB (nan%), ID=0xB", mnt="/dev/pts", type="devpts" 
    FileSystemInfo("/windows", "space 3.51/39.06 GiB (8.98%), ID=0x801", mnt="/windows", type="fuseblk" 
    FileSystemInfo("/dev", "space 0.49/0.49 GiB (99.94%), ID=0xF", mnt="/dev", type="tmpfs" 
    FileSystemInfo("/sys/fs/fuse/connections", "space 0.00/0.00 GiB (nan%), ID=0x10", mnt="/sys/fs/fuse/connections", type="fusectl" 
    FileSystemInfo("/dev/shm", "space 0.49/0.49 GiB (99.91%), ID=0x11", mnt="/dev/shm", type="tmpfs" 
    FileSystemInfo("/var/run", "space 0.49/0.49 GiB (99.94%), ID=0x12", mnt="/var/run", type="tmpfs" 
    FileSystemInfo("/media/SHARED", "space 120.22/208.22 GiB (57.74%), ID=0x805", mnt="/media/SHARED", type="fuseblk" 
    FileSystemInfo("/var/lock", "space 0.49/0.49 GiB (100.00%), ID=0x13", mnt="/var/lock", type="tmpfs" 
    FileSystemInfo("/lib/init/rw", "space 0.49/0.49 GiB (100.00%), ID=0x14", mnt="/lib/init/rw", type="tmpfs" 
    FileSystemInfo("/", "space 6.33/13.84 GiB (45.75%), ID=0x807", mnt="/", type="ext4" 
    FileSystemInfo("/proc/sys/fs/binfmt_misc", "space 0.00/0.00 GiB (nan%), ID=0x15", mnt="/proc/sys/fs/binfmt_misc", type="binfmt_misc" 
    FileSystemInfo("/home", "space 1.00/13.57 GiB (7.35%), ID=0x808", mnt="/home", type="ext3" 
    FileSystemInfo("/opt", "space 2.32/20.77 GiB (11.18%), ID=0x809", mnt="/opt", type="ext3" 
    FileSystemInfo("/home/neub/.gvfs", "space 0.00/0.00 GiB (nan%), ID=0x16", mnt="/home/neub/.gvfs", type="fuse.gvfs-fuse-daemon" 
    FileSystemInfo("/media/USB_100", "space 18.82/93.11 GiB (20.21%), ID=0x811", mnt="/media/USB_100", type="vfat" 
    FileSystemInfo("/media/PENDRIVE4GB", "space 0.22/3.87 GiB (5.79%), ID=0x861", mnt="/media/PENDRIVE4GB", type="vfat"

  10. #10
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Un "disk", c'est très vague pour moi: HDD? FLASH? CD? de toutes façons, je crains qu'il n'y ait d'autre méthode que celle que tu viens d'énoncer...
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  11. #11
    Membre habitué
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Points : 145
    Points
    145
    Par défaut
    Okay merci du coup je vais virer les filesystem qui ont stvfs.f_blocks==0 ou qui ont comme type: "tmpfs".
    je crois que c'est plus efficace

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

Discussions similaires

  1. [systeme] Point de montage : problème
    Par bebertc dans le forum Windows XP
    Réponses: 2
    Dernier message: 05/05/2008, 12h55
  2. Connaitre le nom du propriétaire d'un fichier
    Par zygoto dans le forum Access
    Réponses: 8
    Dernier message: 12/07/2006, 22h07
  3. Créer un point de montage sur C:
    Par marcus333 dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 30/11/2005, 11h09
  4. [langage] recuperer le point de montage du cdrom
    Par tizef dans le forum Langage
    Réponses: 35
    Dernier message: 23/03/2005, 13h34
  5. Changer les points de montages des partitions
    Par Thrystan dans le forum Administration système
    Réponses: 6
    Dernier message: 13/08/2004, 16h46

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