Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

Все эти функции возвращают

– 1
в случае ошибки и
0
— в случае успеха, если только не указано иначе. Большинство их прототипов находятся в
<unistd.h>
. Те, что расположены где-то еще, отмечены ниже.

int setreuid(uid_t ruid, uid_t euid);
Устанавливает действительный uid текущего процесса в
ruid
и эффективный uid процесса в
euid
. Если оба параметра равны
– 1
, то uid остаются неизменными.
int setregid(gid_t rgid, gid_t egid);
Устанавливает действительный gid текущего процесса в
rgid
и эффективный gid процесса в
egid.
Если оба параметра равны
– 1
, то gid остаются неизменными.
int setuid(uid t uid);
Если применяется обычным пользователем, то устанавливает эффективный uid текущего процесса в значение параметра
uid
. Если используется процессом с эффективным uid, равным 0, то устанавливает действительный, эффективный и сохраненный uid в значение параметра
uid
.
int setgid(gid_t gid);
Если применяется обычным пользователем, то устанавливает эффективный gid текущего процесса в значение параметра
gid
. Если используется процессом с эффективным gid, равным 0, то устанавливает действительный, эффективный и сохраненный gid в значение параметра
gid
.
int seteuid(uid_t uid);
Эквивалент
setreuid(-1, uid)
.
int setegid(gid_t gid);
Эквивалент
setregid(-1, gid)
.
int setfsuid(uid_t fsuid);
Устанавливает fsuid текущего процесса в значение параметра
fsuid
. Прототип находится в
<sys/fsuid.h>
. Возвращает предшествующий fsuid.
int setfsgid(gid_t fsgid);
Устанавливает fsgid текущего процесса в значение параметра
fsgid
. Прототип находится в
<sys/fsuid.h>
. Возвращает предшествующий fsgid.
int setgroups(size_t num, const gid_t * list);
Устанавливает дополнительные группы текущего процесса из списка, переданного в массиве
list
, который должен содержать
num
элементов. Макрос
SC_NGROUPS_MAX
указывает, сколько групп может быть в списке (от 32 до 65536, в зависимости от работающей у вас версии Linux).
uid_t getuid;
Возвращает действительный uid процесса.
uid_t geteuid;
Возвращает эффективный uid процесса.
gid_t getgid;
Возвращает действительный gid процесса.
gid_t getegid;
Возвращает эффективный gid процесса.
size_t getgroups (size_t size, gid_t list[]);
Возвращает текущий набор дополнительных групп процесса в массиве
list
. Параметр
size
сообщает, сколько элементов типа
gid_t
может содержать
list
. Если размер
list
недостаточен, чтобы вместить все группы, возвращается
– 1
, а
errno
устанавливается в
EINVAL
. В противном случае возвращается фактическое количество групп в
list
. Если
size
равен
0
, возвращается количество групп, но
list
не затрагивается. Прототип функции
getgroups
находится в
<grp.h>
.

10.3. Информация о процессе

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

10.3.1. Аргументы программы

Есть два типа значений, передаваемых новым программам при их запуске: аргументы командной строки и переменные окружения. Для их использования установлено множество соглашений, но система сама по себе не придерживается их автоматически. Однако хорошим тоном считается придерживаться этих соглашений, чтобы помочь вашим программам попасть в мир Unix.

Аргументы командной строки — это набор строк, передаваемый программе. Обычно они представляют собой текст, набранный вслед за именем команды в оболочке, с необязательными аргументами, начинающимися с символа "минус"

(-
).

Переменные окружения — это набор пар "имя-значение". Каждая пара представляет отдельную строку в форме

ИМЯ=ЗНАЧЕНИЕ
, и набор таких строк образует окружение (environment) программы. Например, домашний каталог текущего пользователя обычно указан в переменной окружения HOME, поэтому программы, скажем, пользователя Joe часто запускаются, имея в своем окружении
HOME=/home/joe
.

И аргументы, и окружение становятся доступными программе при запуске. Аргументы командной строки передаются в виде параметров главной функции программы —

main
, в то время как указатель на окружение помещается в глобальную переменную
environ
, которая определена в
<unistd.h>
[18] .

Ниже представлен полный прототип функции

main
в мире Linux, Unix и языка ANSI/ISO С.

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

18

Большинство систем передают окружение в виде параметра

main
, но такой метод не включен в стандарт POSIX. Переменная
environ
 — это метод, утвержденный POSIX.

Возможно, вас удивит, что

main
возвращает значение (отличное от
void
). Это значение, возвращаемое функцией main, передается родительскому процессу после завершения данного. По соглашению 0 означает, что процесс завершен успешно, а ненулевое значение означает возникновение сбоя. При этом принимаются во внимание только младшие 8 бит из этого кода возврата. Отрицательные значения от -1 до -128 зарезервированы для ненормального завершения процессов по инициативе другого процесса или ядра системы. Код выхода 0 сигнализирует об успешном завершении, а значения от 1 до 127 говорят о том, что программа завершена по ошибке.

Первый параметр,

argc
, содержит количество аргументов командной строки, переданных программе, тогда как
argv
— массив указателей на строки — хранит сами аргументы. Первый элемент в массиве,
argv[0]
, содержит имя вызванной программы (хотя и не обязательно полный путь к ней). В элементе
argv[argc-1]
расположен указатель на завершающий аргумент командной строки, а
argv[argc]
содержит
NULL
.

Чтобы получить прямой доступ к окружению, используйте следующую глобальную переменную:

extern char *environ[];

Это представляет

environ
как массив указателей на каждый элемент программного окружения (помните, каждый элемент — это пара
ИМЯ=ЗНАЧЕНИЕ
), и финальный элемент массива содержит
NULL
. Это объявление находится в
<unistd.h>
, поэтому вам не обязательно объявлять его самостоятельно.

Наиболее общий способ проверки элементов окружения — это вызов

getenv
, который исключает непосредственное обращение к переменной
environ
.

const char *getenv(const char * name);

Единственный параметр

getenv
— это имя переменной окружения, значение которой интересует. Если переменная существует,
getenv
вернет указатель на ее значение. Если переменная не существует в текущем окружении (то есть окружении, на которое указывает
environ
), функция вернет
NULL
.

Linux предоставляет два способа добавления строк в программное окружение:

setenv
и
putenv
. POSIX определяет только
putenv
, что делает его более переносимым.

  • Читать дальше
  • 1
  • ...
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: