Структура
#define NAME_MAX 14 /* максимальная длина имени файла */
/* системно-зависимая величина */
typedef struct { /* универс. структура элемента каталога: */
long ino; /* номер inode */
char name[NAME_MAX+1]; /* имя + завершающий '\0' */
} Dirent;
typedef struct { /* минимальный DIR: без буферизации и т.д. */
int fd; /* файловый дескриптор каталога */
Dirent d; /* элемент каталога */
} DIR;
DIR *opendir(char *dirname);
Dirent *readdir(DIR *dfd);
void closedir(DIR *dfd);
Системный вызов
char *name;
struct stat stbuf;
int stat(char *, struct stat *);
stat(name, &stbuf);
заполняет структуру
struct stat /* информация из inode, возвращаемая stat */
{
dev_t st_dev; /* устройство */
ino_t st_ino; /* номер inode */
short st_mode; /* режимные биты */
short st_nlink; /* число связей с файлом */
short st_uid; /* имя пользователя-собственника */
short st_gid; /* имя группы собственника */
dev_t st_rdev; /* для специальных файлов */
off_t st_size; /* размер файла в символах */
time_t st_atime; /* время последнего использования */
time_t st_mtime; /* время последней модификации */
time_t st_ctime; /* время последнего изменения inode */
};
Большинство этих значений объясняется в комментариях. Типы, подобные
Элемент
#define S_IFMT 0160000 /* тип файла */
#define S_IFDIR 0040000 /* каталог */
#define S_IFCHR 0020000 /* символьно-ориентированный */
#define S_IFBLK 0060000 /* блочно-ориентированный */
#define S_IFREG 0100000 /* обычный */
Теперь мы готовы приступить к написанию программы
Программа
#include ‹stdio.h›
#include ‹string.h›
#include "syscalls.h"
#include ‹fcntl.h› /* флажки чтения и записи */
#include ‹sys/types.h› /* определения типов */
#include ‹sys/stat.h› /* структура, возвращаемая stat */
#include "dirent.h"
void fsize(char *);
/* печатает размер файлов */
main(int argc, char **argv) {
if (argc == 1) /* по умолчанию берется текущий каталог */
fsize(".");
else
while (--argc › 0)
fsize(*++argv);
return 0;
}