Операционная система 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 присваиваются значения, полученные из записи пользователя в файле паролей