[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Программа доступа к среде исполнения

Это программа  использует некоторые системные вызовы, обсуждавшиеся на
странице 2-23. Она работает следующим образом:

   12     Объявляет массив  groups. getgroups(2)  заполнит этот массив
          группами, максимум  16. Максимальное  число групп, к которым
          может принадлежать пользователь - это параметр конфигурации.
          Значение по умолчанию 16.
   16     Объявляет  структура  rlimit.  Она  используется  системными
          вызовами  getrlimit(2)   и   setrlimit(2).   Эта   структура
          определена в файле <sys/resource.h>:
          struct rlimit {
               rlim_t rlim_cur; /* soft limit*/
               rlim_t rlim_max; /* hard limit*/}

   18     Печатает имя терминального файла с дескриптором файла равным
          0.
   19, 20 Печатает  идентификаторы   самого  процесса,   родительского
          процесса,   пользователя    и   эффективный    идентификатор
          пользователя.
   22-24  Получает  идентификатор  группы  пользователя,  запустившего
          этот процесс.  Использует getgrgid(3C) для определения имени
          группы, связанной с данным идентификатором.
   26     Массив  groups   заполняется  номерами  групп,  связанных  с
          идентификатором пользователя этого процесса.
   27-31  Имя, связанное с номером группы, печатается с использованием
          библиотечной  функции   getgrgid(3C).  Более   подробно  эта
          функция обсуждается дальше в этом курсе.
   33-39  getrlimit(2) получает  текущие    программные  и  аппаратные
          ограничения некоторых  ресурсов.  Программные  и  аппаратные
          ограничения  изменяются   с  помощью  функции  setrlimit(2).
          Символьная   константа    RLIMIT_NOFILE   используется   для
          получения/установки   числа    открытых   файлов   процесса.
          Символьные   константы,    используемые    getrlimit(2)    и
          setrlimit(2), определяются  в файле  <sys/resource.h>. Любой
          пользователь  может  понизить  программные  ограничения  или
          повысить    их    до    аппаратных    ограничений.    Только
          суперпользователь  может  изменить  аппаратные  ограничения.
          Другие ресурсы (символьные константы):

          RLIMIT_CPU  максимальное  время   в  секундах  использования
                      процессом ЦП.
          RLIMIT_FSIZE   максимальный размер файла, который может быть
                      создан.  Встроенная  команда  ulimit  командного
                      интерпретатора shell  выполняет  этот  системный
                      вызов,    используя  эту  символьную  константу.
                      ulimit печатает  ограничение на  размер файла  в
                      блоках по 512 байт.
          RLIMIT_DATA максимальный размер  в байтах  области  процесса
                      для динамических данных.
          RLIMIT_STACK   максимальный размер стека процесса в байтах.
          RLIMIT_CORE максимальный размер в байтах core-файла, который
                      может быть создан.

Файл: process.c

$ process
terminal is: /dev/term/41
pid = 20562, ppid = 20485
uid = 103, euid = 103
primary group is: other
all groups: other src
open files soft limit:   64
open files hard limit: 1024
new soft limit:   5
                 ПРОГРАММА ДОСТУПА К СРЕДЕ ИСПОЛНЕНИЯ
 1 #define NUMGROUPS 16
 2 #include <sys/types.h>
 3 #include <stdlib.h>
 4 #include <stdio.h>
 5 #include <unistd.h>
 6 #include <grp.h>
 7 #include <sys/resource.h>
 8 #include <sys/time.h>
 9
10 main()
11 {
12      gid_t groups[NUMGROUPS];
13      struct group *grp;
...
16      struct rlimit rlp;
17
18      printf("terminal is: %s\n",ttyname(0));
19      printf("pid = %ld, ppid = %ld\n", getpid(), getppid());
20      printf("uid = %ld, euid = %ld\n\n", getuid(), geteuid());
21
22      gid = getgid();
23      grp = getgrgid(gid);
24      printf("primary group is: %s\n", grp->gr_name);
25
26      num = getgroups(NUMGROUPS, groups);
...
33      getrlimit(RLIMIT_NOFILE, &rlp);
34      printf("open files soft limit: %4ld\n", rlp.rlim_cur);
35      printf("open files hard limit: %4ld\n", rlp.rlim_max);
36      rlp.rlim_cur = 5;
37      setrlimit(RLIMIT_NOFILE, &rlp);
38      getrlimit(RLIMIT_NOFILE, &rlp);
39      printf("new soft limit: %4ld\n", rlp.rlim_cur);
40      exit(0);
41 }

.    приоритет процесса
   - nice(2)  получает  в  качестве  аргумента  целое  число,  которое
     добавляется  к  значению  nice-значению  процесса.  nice-значение
     значение  используется   для  вычисления   приоритета   процесса.
     Положительное значение, переданное nice(2), приводит к уменьшению
     приоритета. Только суперпользователь может увеличивать приоритет,
     передавая nice(2) отрицательное значение.

.    файловая система
   - ulimit(2) получает или устанавливает ограничение на размер файла,
     в зависимости от аргумента.

   - umask(2) устанавливает  маску создания и возвращает ее предыдущее
     значение.

   - getcwd(2) получает путевое имя текущей директории.

   - chdir(2) изменяет текущую рабочую директорию.

   - chroot(2) изменяет  корневую директорию.  Замечание:  эффективный
     идентификатор  должен   быть  идентификатором  суперпользователя.
     chroot  может   быть  использован,   чтобы  ограничить  доступ  к
     поддереву  файлов.   Желаемые  программы   и  файлы  должны  быть
     скопированы в  место ниже  нового корня. Если они находятся в той
     же самой файловой системе, то могут быть установлены связи (link)
     с этими файлами.

.    параметры исполнения
   - Второй аргумент  main(argc, argv)  является указателем  на массив
     символьных указателей,  которые указывают  на аргументы командной
     строки.

.    переменные командного интерпретатора shell
   - Ранее экспортированные  переменные создают  среду процесса. Более
     детальное описание приведено на следующих страницах.

Информация                              Метод

приоритет процесса                      nice(2)

файловая система                        ulimit(2)
                                        umask(2)
                                        getcwd(3C)
                                        chdir(2)
                                        chroot(2)+

параметры среды исполнения              char *argv[]

shell-переменные                        extern char **environ;
                                        char **envp;
                                        getenv(3C)
                                        putenv(3C)




+должен быть суперпользователем