Программирование >>  Структура ядра и системные вызовы 

1 ... 30 31 32 [ 33 ] 34 35 36 ... 98


#endif

/* symfile.h */

Функция symfUer.create создает символическую ссылку с помощью API symlink. Аргумент newjink - это путевое имя новой символической ссылки, которая должна быть создана, а old Jink - путевое имя исходного файла. Функция symfiler.create возвращает то же значение, что и функция API symlink.

Символическую ссылку можно открывать, читать, записывать в нее данные и закрывать как обычный файл. Таким образом, symfde наследует все функции./stream, необходимые для информационного доступа к ее объектам. Все операции выполняются с реальным файлом, на который указывает символическая ссылка. Кроме того, определена функция symfde::ref path, с помощью которой пользователи могут запрашивать путевое имя реального файла, на который указывает объект класса symfde.

Ниже приведена программа test symfde. С, предназначенная для создания символической ссылки /usr/xyz/sym.lnk, которая обозначает файл /usr/flle/chaplO. Программа открывает файл и читает его содержимое. Затем она выводит на экран путевое имя ссылки и закрывает файл:

linclude symfile.h int main О

(

char buf[256]; symfile nsym;

nsym.setlink( /usr/file/chaplO , /usr/xyz/sym.Ink nsym. open ( ios:: in ); , while (nsym.getline(buf,256))

cout buf endl; прочитать /usr/file/chapIO

cout nsym.ref path0 endl; вывести на экран имя файла

/usr/file/chaplO nsym.close О; закрыть файл, представляющий

собой символическую ссылку

return 0; )

7.13. Программа вывода

на экран списка файлов

В качестве примера использования класса filebase и его подклассов ниже приведена программа Istdir.C, которая эмулирует UNlX-команду Is, с тем чтобы получить список атрибутов всех файлов, заданных аргументами программы. Если аргумент - это каталог, то программа выдает список атрибутов всех файлов, содержащихся в данном каталоге и его подкаталогах. Если файл является символической ссылкой, программа выдает путевое имя, на которое указывает эта ссылка. Таким образом, рассматриваемая программа работает как UNIX-команда Is -IR.

♦include filebase.h ♦include symfile.h , ♦include dirfile.h

extern void long list( ostreams ofs, const char* fname ); void show list( ostreams ofs, char* fname, int deep);

/* программа реализации UNIX-команды Is -IR */ void show dir( ostream& ofs, const char* fname ) {

dirfile dirObj(fname); char buf[256];

ofs \nDirectory: fname :\n ;

while (dirObj.read(buf,256)) показать все файлы в каталоге

show list(ofs, buf,0); dirObj.seekg(0); установить указатель позиции

Э начало файла while (dirObj.read(buf,256)). искать каталоги {

filebase fObj(buf,ios::in,0755);

определить объект класса filebase

if (fObj . file type()=DIR FILE)

выдать информацию о подкаталогах

show dir(ofs,buf); fObj.close О;

dirObj.close();

void show list( ostreams ofs, const char* fname, int deep) {

long list( ofs, fname);

filebase fobj(fname,ios::in, 0755) ;

if (fobj.file type()==SyM FILE) символическая ссылка

U ........J.................................

symfile *symObj = (symfile*)Sfobj;

, . . I определит! объект кларса symfile

ofs -> symObj->ref path() endl;

показать путевое имя ссылки

else if (fobj.file typeО == DIR FILE &S deep) каталог

show dir( ofs, fname ); показать содержимое каталога

int main( int argc, char* argv[]) {

while (--argc > 0) show list( cout , *++argv, 1); return 0; ~

Эта программа похожа на программу, приведенную в разделе 7.1.10, за исключением того, что она выдает символические ссылки и перечисляет



содержимое каталога рекурсивно. Функция main обрабатывает каждый аргумент командной строки, вызывая функцию show Jile для отображения атрибутов каждого файла на стандартном выводе. Аргумент deep функции showJile указывает (если он имеет ненулевое значение), что если аргумент fname - каталог, show Jile должна вызвать функцию show dir для построения списка содержимого этого каталога. Когда show Jde вызывается из головного модуля main, фактическое значение deep устанавливается равным 1.

Функция showjdir вызывается для вывода содержимого каталога. Сначала она создает объект класса dirfile для связывания его с каталогом, имя которого задано аргументом fname. Затем она вызывает функцию show Jde, перечисляющую атрибуты каждого файла данного каталога. В этом первом проходе showJile вызывается с нулевым значением аргумента deep, чтобы showJde при вызове show dir не выводила содержимое подкаталогов. После завершения первого прохода show dir просматривает данный каталог во второй раз и ищет подкаталоги. Для каждого обнаруженного подкаталога эта функция вызывает себя рекурсивно и выдает список содержимого подкаталога. Именно так ведет себя UNIX-команда Is -IR.

Рассмотрим в качестве примера следующую структуру каталогов:


В результате выполнения профаммы Istdir получаем следующее:

% СС -о Istdir Istdir.С % Istdir tc

-r-xr-xr-x 1 util

Irwxrwxrwx 1 util

/us r/dsg/unix.Ink drwxr-x-X 1 util

class 1234 Apr 8, 1997 a.out

class 122 Apr 11, 1997 a symlink ->

class 234 Jan 17, 1997 xyz

7.14. Заключение

В этой главе описаны файловые API операционной системы UNIX и стандарта POSIX. Эти интерфейсы прикладного программирования используются для создания, открытия, чтения, записи и закрытия файлов всех типов: обычных, каталогов, файлов устройств, FIFO-файлов и символических ссылок. Для инкапсуляции свойств и функций файлов всех типов определен набор классов С++, с помощью которых пользователи могут манипулировать файлами, используя тот же интерфейс, который применяется для класса iostream. Все эти классы переносимы на все UNIX- и POSIX-системы. Исключение составляет класс символических ссылок (symfile), который в стандарте POSIX. 1 еще не определен.

На рисунке показана иерархия всех классов, предназначенных для работы с файлами, которые были рассмотрены в этой главе.

iostream

fstream, filebase ,

regfile

devfile

dirfile

pipefile

symfile

Файловыми объектами манипулируют процессы, запущенные в операционной системе. Интерфейсы прикладного профаммирования ОС UNIX и стандарта POSIX, предназначенные для создания процессов и управления ими, рассмафиваются в следующей главе.

Directory: xyz

-rw-r~r- 1 util class 814

-rwxrwxrwx 1 util class 112

Dec 18, 1996 prog.с May 21, 1997 prog.h



ГЛАВА


Процессы операционной системы UNIX

Процесс - это программа UNIX- или POSIX-системы (например, a.out), находящаяся в стадии выполнения. Скажем, she]] в UNIX - это процесс, который создается при входе пользователя в систему. Более того, когда пользователь вводит команду cat foo, shell создает новый процесс. Согласно терминологии UNIX, это - порожденный процесс, который выполняет команду cat от лица пользователя. Процесс, создавший порожденный процесс (или процесс-потомок), становится родительским процессом. Порожденный процесс наследует от родительского многие атрибуты и планируется ядром UNIX к выполнению независимо от родительского.

Имея возможность создавать несколько параллельно работающих процессов, операционная система может одновременно обслуживать нескольких пользователей и выполнять несколько задач. Таким образом, задача создания Процессов и управления ими - краеугольный камень такой многопользовательской, многозадачной операционной системы, как UNIX. Способность Процесса создавать в процессе выполнения новые процессы дает следующие Преимущества:

1. Любой пользователь имеет право создавать многозадачные приложения.

2. Поскольку порожденный процесс выполняется в собственном виртуальном адресном пространстве, успех или неудача при его выполнении на родительский процесс не влияют. Родительский процесс может после завершения порожденного им процесса запросить статус завершения и статистические данные, относящиеся к периоду выполнения порожденного процесса.



1 ... 30 31 32 [ 33 ] 34 35 36 ... 98

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика