Операционная система UNIX - страница 66

стр.

>

> printf("perm =%o\n", s.st_mode & S_IAMB);

> /* Номер inode */

> printf("inode = %d\n", s.st_ino);

> /* Число связей */

> printf("nlink = %d\n", s.st_nlink);

> /* Устройство, на котором хранятся данные файла */

> printf("dev = (%d, %d)\n", major(s.st_dev), minor(s.st_dev));

> /* Владельцы файла */

> printf("UID = %d\n", s.st_uid);

> printf("GID = %d\n", s.st_gid);

> /* Для специальных файлов устройств - номера устройства */

> printf("rdev = (%d, %d)\n", major(s.st_rdev),

> minor(s.st_rdev));

> /* Размер файла */

> printf("size = %d\n", s.st_size);

> /* Время доступа, модификации и модификации метаданных */

> printf("atime = %s", ctime(&s.st_atime));

> printf("mtime = %s", ctime(&s.st_mtime));

> printf("ctime = %s", ctime(&s.st_ctime));

>}

Программа использует библиотечные функции major(3C) и minor(3C), возвращающие, соответственно, старший и младший номера устройства. Функция ctime(3C) преобразует системное время в удобный формат.

Запуск программы на выполнение приведет к следующим результатам:

>$ а.out ftype.c

>type = Обычный файл

>perm = 644

>inode = 13

>nlink = 1

>dev = (1, 42)

>UID = 286

>GID = 100

>rdev = (0, 0)

>size = 1064

>atime = Wed Jan 8 17:25:34 1997

>mtime = Wed Jan 8 17:19:27 1997

>ctime = Wed Jan 8 17:19:27 1997

>$ ls -il /tmp/ftype.c

>13 -rw-r--r-- 1 andy user 1064 Jan 8 17:19 ftype.c

Процессы

В главе 1 уже упоминались процессы. Однако знакомство ограничивалось пользовательским, или командным интерфейсом операционной системы. В этом разделе попробуем взглянуть на них с точки зрения программиста.

Процессы являются основным двигателем операционной системы. Большинство функций выполняется ядром требованию того или иного процесса. Выполнение этих функций контролируется привилегиями процесса, которые соответствуют привилегиям пользователя, запустившего его.

В этом разделе рассматриваются:

□ Идентификаторы процесса

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

□ Важнейшие системные вызовы, обеспечивающие создание нового процесса и запуск новой программы. Именно с помощью этих вызовов создается существующая популяция процессов в операционной системе и ее функциональность.

□ Сигналы и способы управления ими. Сигналы можно рассматривать как элементарную форму межпроцессного взаимодействия, позволяющую процессам сообщать друг другу о наступлении некоторых событий. Более мощные средства будут рассмотрены в разделе "Взаимодействие между процессами" главы 3.

□ Группы и сеансы; взаимодействие процесса с пользователем.

□ Ограничения, накладываемые на процесс, и функции, которые позволяют управлять этими ограничениями.

Идентификаторы процесса

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

Однако нельзя не отметить еще четыре идентификатора, играющие решающую роль при доступе к системным ресурсам: идентификатор пользователя UID, эффективный идентификатор пользователя EUID, идентификатор группы GID и эффективный идентификатор группы EGID. Эти идентификаторы определяют права процесса в файловой системе, и как следствие, в операционной системе в целом. Запуская различные команды и утилиты, можно заметить, что порожденные этими командами процессы полностью отражают права пользователя UNIX. Причина проста — все процессы, которые запускаются, имеют идентификатор пользователя и идентификатор группы. Исключение составляют процессы с установленными флагами SUID и SGID.

При регистрации пользователя в системе утилита login(1) запускает командный интерпретатор, — login shell, имя которого является одним из атрибутов пользователя. При этом идентификаторам UID (EUID) и GID (EGID) процесса shell присваиваются значения, полученные из записи пользователя в файле паролей