2009-05-12 5 views

Répondre

2

Regardez dans stat(). On dirait que vous êtes sur un système Linux ou POSIX, ce qui devrait être le cas.

Ensuite, regardez le champ st_mode du struct stat, il contient les informations sur les bits de protection, qui sont souvent appelés collectivement « mode » d'un fichier (comme en témoigne la commande chmod qui change les paramètres).

Passer des bits binaires à une représentation textuelle comme ls 'est ... un défi intéressant.

3

La stat() appel système prend une chaîne de nom de fichier et retourne la structure suivante:

struct stat { 
    dev_t  st_dev;  /* ID of device containing file */ 
    ino_t  st_ino;  /* inode number */ 
    mode_t st_mode; /* protection */ 
    nlink_t st_nlink; /* number of hard links */ 
    uid_t  st_uid;  /* user ID of owner */ 
    gid_t  st_gid;  /* group ID of owner */ 
    dev_t  st_rdev; /* device ID (if special file) */ 
    off_t  st_size; /* total size, in bytes */ 
    blksize_t st_blksize; /* blocksize for filesystem I/O */ 
    blkcnt_t st_blocks; /* number of blocks allocated */ 
    time_t st_atime; /* time of last access */ 
    time_t st_mtime; /* time of last modification */ 
    time_t st_ctime; /* time of last status change */ 
}; 

Cela fonctionne aussi bien sur les entrées du répertoire ainsi que les fichiers et le st_mode est le domaine spécifique que vous cherchez .

Le fichier d'en-tête <sys/stat.h> doit contenir cette structure et toutes les définitions ainsi que #defines macros et/ou de décodage de manière intelligente les champs (voir here pour un échantillon).

Si vous êtes intéressé par la façon dont c'est vraiment fait, vous pouvez regarder le code source ls dans GNU coreutils. Mais utilisez seulement cela pour vous éduquer. C'est la GPL, donc vous ne pouvez pas l'attraper à vos propres fins et, si c'est un devoir, votre éducateur vous manquera certainement si vous lui donnez quelque chose qui ressemble trop à ceci.

+0

salut, pouvez-vous me donner un exemple de programme 'c' pour faire la commande 'ls -l'? Merci –

+4

Non, parce que vous n'avez même pas * essayé * de le faire vous-même. Je suis ici pour aider les gens à apprendre, ne pas faire leur travail pour eux. – paxdiablo

Questions connexes