Kniga-Online.club
» » » » UNIX — универсальная среда программирования - Керниган Брайан Уилсон

UNIX — универсальная среда программирования - Керниган Брайан Уилсон

Читать бесплатно UNIX — универсальная среда программирования - Керниган Брайан Уилсон. Жанр: Интернет год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

struct stat stbuf;

stat(name, &stbuf);

fstat(fd, &stbuf);

заполняет структуру stbuf информацией из индексного дескриптора для имени файла или дескриптора файла fd.

Зная все это, мы можем приступить к написанию некоторой полезной программы. Начнем с версии checkmail — программы на Си, которая следит за содержимым вашего почтового ящика. Если файл увеличивается, checkmail выдает сообщение: "У вас есть корреспонденция" и включает звонок. (При уменьшении файла, видимо, из-за того, что вы успели прочитать и сбросить некоторую почтовую корреспонденцию, сообщение не требуется.) Для первого шага вы сделали вполне достаточно, а когда ваша программа заработает, вы станете знатоком.

/* 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 mail07n");

  lastsize = buf.st_size;

  sleep(60);

 }

}

Функция getlogin(3) возвращает ваше регистрационное имя или NULL, если это невозможно, checkmail переходит к почтовому каталогу с помощью системного вызова chdir, так что последующие вызовы stat не должны будут "добираться" до почтового каталога через все каталоги, начиная от корневого. Возможно, вы должны адаптировать maildir для своей системы. Мы написали checkmail так, чтобы она работала, даже если нет почтового ящика, поскольку большинство версий mail убирают почтовый ящик в том случае, когда он пуст.

Мы приводили эту программу в гл. 5 для иллюстрации циклов shell. Всякий раз при проверке почтового ящика она создает несколько процессов и загружает систему больше, чем хотелось бы. Версия на Си — единственный процесс, который выполняет stat для файла каждую минуту. Сколько времени требуется на то, чтобы checkmail постоянно выполнялась как фоновая задача? Как показали наши измерения, это время составляет меньше секунды в час, так что им вполне можно пренебречь.

sv: иллюстрация обработки ошибок

Следующей мы собираемся написать похожую на cp программу sv, которая будет копировать множество файлов в каталог, заменяя каждый файл лишь в том случае, если его нет в каталоге или он "старше" копируемого с тем же именем (имя sv означает "сохранять"). Суть действия программы состоит в том, что она не переписывает новую версию файла, sv использует больше информации из индексного дескриптора, чем checkmail. Вызов sv будет иметь такую конструкцию:

$ sv file1 file2 ... dir

Она копирует file1 в dir/file1, file2 в dir/file2 и т.д., если только целевой файл не новее, чем файл-источник; в этой ситуации копирование не происходит и печатается соответствующее предупреждение. Во избежание создания большого числа копий или связанных файлов sv не допускает применения символов '/' в любом исходном имени файла.

/* 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.

Перейти на страницу:

Керниган Брайан Уилсон читать все книги автора по порядку

Керниган Брайан Уилсон - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


UNIX — универсальная среда программирования отзывы

Отзывы читателей о книге UNIX — универсальная среда программирования, автор: Керниган Брайан Уилсон. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*