struct stat stbuf;stat(name, &stbuf);fstat(fd, &stbuf);заполняет структуру
stbuffdЗная все это, мы можем приступить к написанию некоторой полезной программы. Начнем с версии
checkmailcheckmail/* checkmail: watch user's mailbox */#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>char *progname;char *maildir = "/usr/spool/mail"; /* system dependent */main(argc, argv) int argc; char *argv[];{ struct stat buf; char *name, *getlogin(); int lastsize = 0; progname = argv[0]; if ((name = getlogin()) == NULL) error("can't get login name", (char*)0); if (chdir(maildir) == -1) error("can't cd to %s", maildir); for (;;) { if (stat(name, &buf) == -1) /* no mailbox */ buf.st_size = 0; if (buf.st_size > lastsize) fprintf(stderr, "\nYou have mail\007\n"); lastsize = buf.st_size; sleep(60); }}Функция
getlogin(3)NULLcheckmailchdirstatmaildircheckmailМы приводили эту программу в гл. 5 для иллюстрации циклов
shellstatcheckmailsvСледующей мы собираемся написать похожую на
cpsvsvsvcheckmailsv$ sv file1 file2 ... dirОна копирует
file1dir/file1file2dir/file2sv'/'/* sv: save new files */#include <stdio.h>#include <sys/types.h>#include <sys/dir.h>#include <sys/stat.h>char *progname;main(argc, argv) int argc; char *argv[];{ int i; struct stat stbuf; char *dir = argv[argc-1]; progname = argv[0]; if (argc <= 2) error("Usage: %s files... dir", progname); if (stat(dir, &stbuf) == -1) error("can't access directory %s", dir); if ((stbuf.st_mode & S_IFMT) != S_IFDIR) error("%s is not a directory", dir); for (i = 1; i < argc-1; i++) sv(argv[i], dir); exit(0);}Значения времени, хранящиеся в индексных дескрипторах, исчисляются в секундах (за начало отсчета принято время 0:00 по Гринвичу, 1 января 1970 г.), так что более старые файлы имеют меньшие значения в поле
st_mtime