[<<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)
+должен быть суперпользователем