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

Тут можно читать онлайн Брайан Керниган - UNIX — универсальная среда программирования - бесплатно ознакомительный отрывок. Жанр: comp-osnet, издательство Финансы и статистика, год 1992. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    UNIX — универсальная среда программирования
  • Автор:
  • Жанр:
  • Издательство:
    Финансы и статистика
  • Год:
    1992
  • Город:
    Москва
  • ISBN:
    5-289-00253-4
  • Рейтинг:
    5/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

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

UNIX — универсальная среда программирования - описание и краткое содержание, автор Брайан Керниган, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями shell.

Для программистов-пользователей операционной системы UNIX.

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

UNIX — универсальная среда программирования - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Брайан Керниган
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать
Упражнение 7.5

Насколько вы можете улучшить эвристику для выявления наилучшего совпадения в spname? Например, неразумно рассматривать регулярный файл так, как если бы он был каталогом; текущая версия это допускает.

Упражнение: 7.6

Имя txсовпадает с каким-либо именем tc, которое оказывается последним в каталоге для любого одиночного символа с. Можете ли вы придумать лучшую меру расстояния? Реализуйте ее и посмотрите, насколько хорошо эта конструкция работает с реальными пользователями.

Упражнение 7.7

Работает ли pощутимо быстрее, если чтение каталога выполняется большими порциями?

Упражнение 7.8

Модифицируйте spname, чтобы возвращать имя, которое является префиксом желаемого имени, если нельзя найти более точного совпадения. Как следует разрешить ситуацию, если несколько имен совпадают с префиксом?

Упражнение 7.9

Какую пользу могли бы извлечь другие программы из spname? Сконструируйте отдельную программу, которая корректировала бы другие аргументы прежде, чем передать их другой программе, как в

$ fix prog filenames...

Можете написать версию cd, которая использует spname? Как бы вы ее встроили?

7.3 Файловая система: индексные дескрипторы

Теперь мы обсудим системные вызовы применительно к файловой системе, в частности к такой информации о файлах, как размеры, даты изменений, права доступа и т.д. Эти системные вызовы позволяют получить полностью всю информацию, о которой упоминалось во второй главе.

Для начала разберемся в самом индексном дескрипторе. Часть индексного дескриптора описывается структурой stat, определенной в :

struct stat /* структура, возвращаемая stat */

{

dev_t st_dev; /* устройство, содержащее файл */

ino_t st_ino; /* индекс */

short st_mod; /* биты режима */

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; /* время последнего изменения

индексного дескриптора или файла */

}

Большинство полей поясняются примечаниями. Типы вроде dev_tи ino_tопределены в , как отмечено выше. Поле st_modeсодержит множество флагов, описывающих файл; для удобства определения флагов также являются частью файла :

#define S_IFMT 0170000 /* тип файла */

#define S_IFDIR 0040000 /* каталог */

#define S_IFCHR 0020000 /* байт-ориентированный */

#define S_IFBLK 0060000 /* блок-ориентированный */

#define S_IFREG 0100000 /* регулярный */

#define S_SUID 0004000 /* установка идентификатора пользователя при

выполнении */

#define S_ISGID 0002000 /* установка идентификатора группы

при выполнении */

#define S_ISVTX 0001000 /* сохранить выгруженный текст даже после

использования */

#define S_IREAD 0000400 /* разрешение читать, владелец */

#define S_IWRITE 0000200 /* разрешение писать, владелец */

#define S_IEXEC 0000100 /* разрешение на выполнение/поиск, владелец */

Индексный дескриптор для файла доступен двум системным вызовам statи fstat. При вызове statпараметром является имя файла, а результатом — информация из индексного дескриптора для этого файла (или — 1 при наличии ошибки). Fstatвыполняет те же функции в отношении дескриптора открытого файла (не в отношении указателя на FILE). Иными словами,

char *name;

int fd;

struct stat stbuf;

stat(name, &stbuf);

fstat(fd, &stbuf);

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

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

/* checkmail: watch user's mailbox */

#include

#include

#include

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)возвращает ваше регистрационное имя или 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не допускает применения символов '/'в любом исходном имени файла.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


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

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




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


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


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x