Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

Отрицательное значение относительного приоритета, с другой стороны, означает, что процесс желает быть «менее приятным» по отношению к другим. Такой процесс более эгоистичный, требуя себе большего количества времени процессора [89] . К счастью, в то время как пользователи могут повышать значение относительного приоритета (быть более приятными), лишь

root
может снижать значение относительного приоритета (быть менее приятным).

Значение относительного приоритета является лишь одним фактором в уравнении, используемом ядром для вычисления приоритета; это не значение самого приоритета, которое изменяется с течением времени на основе поведения процесса и состояния других процессов системы. Для изменения значения относительного приоритета используется системный вызов

nice
:

89

Такие процессы часто демонстрируют детское поведение. — Примеч. автора.

#include <unistd.h> /* XSI */

int nice(int inc);

Значение относительного приоритета по умолчанию равно 0. Разрешен диапазон значений от -20 до 19. Это требует некоторой привычки. Чем более отрицательное значение, тем выше приоритет процесса: -20 является наивысшим приоритетом (наименьшая приятность), а 19 — наинизшим приоритетом (наибольшая приятность)

Аргумент

inc
является приращением, на который надо изменить значение приоритета. Для получения текущего значения, не изменяя его, используйте '
nice(0)
'. Если результат '
текущий_относительный_приоритет + inc
' выйдет за пределы от -20 до 19, система принудительно включит его в этот диапазон.

Возвращаемое значение является новым значением относительного приоритета или -1, если возникла ошибка. Поскольку -1 также является действительным значением относительного приоритета, при вызове

nice
следует сначала явным образом установить
errno
в ноль, а затем проверить его насчет имевшихся проблем:

int niceval;

int inc = /* любое значение */;

errno = 0;

if ((niceval = nice(inc)) < 0 && errno != 0) {

 fprintf(stderr, "nice(%d) failed: %s\n", inc, strerror(errno));

 /* другое восстановление */

}

Этот пример может завершиться неудачей, если в

inc
отрицательное значение, а процесс не запущен как
root
.

9.1.3.1. POSIX против действительности

Диапазон значений относительного приоритета от -20 до 19, которые использует Linux, имеет исторические корни; он ведет начало по крайней мерее V7. POSIX выражает состояние менее прямым языком, что дает возможность большей гибкости, сохраняя в то же время историческую совместимость. Это также затрудняет чтение и понимание стандарта, вот почему вы и читаете эту книгу. Итак, вот как описывает это POSIX

Во-первых, значение относительного приоритета процесса, поддерживаемое системой, колеблется от 0 до '

(2 * NZERO) - 1
'. Константа
NZERO
определена в
<limits.h>
и должна равняться по крайней мере 20. Это дает диапазон 0–39.

Во-вторых, как мы описывали, сумма текущего значения относительного приоритета и приращение

incr
загоняются в этот диапазон.

В заключение, возвращаемое

nice
значение является значением относительного приоритета процесса минус
NZERO
. При значении
NZERO
20 это дает первоначальный диапазон от -20 до 19, который мы описали вначале.

Результатом является то, что возвращаемое nice значение в действительности изменяется от '

– NZERO
' до '
NZERO-1
', и лучше всего писать свой код в терминах этой именованной константы. Однако, на практике трудно найти систему, в которой
NZERO
не было бы равно 20.

9.1.4. Запуск новой программы: семейство

exec

После запуска нового процесса (посредством

fork
) следующим шагом является запуск в процессе другой программы. Имеется несколько функций, которые служат различным целям:

#include <unistd.h> /* POSIX */

int execve(const char *filename, /* Системный вызов */

char *const argv[], char *const envp[]);

int execl(const char *path, const char *arg, ...); /* Оболочки */

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg, ..., char *const envp[]);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

Мы ссылаемся на эти функции как на «семейство

exec
». Функции с именем
exec
нет; вместо этого мы используем это имя для обозначения любой из перечисленных выше функций. Как и в случае с
fork
, «
exec
» используется на языке Unix и в качестве глагола, означающего исполнение (запуск) программы, и в качестве существительного.

9.1.4.1. Системный вызов

execve

Простейшей для объяснения функцией является

execve
. Она является также лежащим в основе системным вызовом. Другие являются функциями-оболочками, как вскоре будет объяснено.

int execve(const char *filename, char *const argv[],

 char* const envp[]);

filename
является именем программы для исполнения. Это может быть именем полного или относительного пути. Файл должен иметь формат исполняемого файла, который понимает ядро. Современные системы используют формат исполняемого файла ELF (Extensible Linking Format — открытый формат компоновки). GNU/Linux распознает ELF и несколько других форматов. С помощью
execve
можно исполнять интерпретируемые сценарии, если они используют особую первую строку с именем интерпретатора, начинающуюся с '
#!
'. (Сценарии, которые не начинаются с '
#!
', потерпят неудачу.) В разделе 1.1.3 «Исполняемые файлы» представлен пример использования '#!'. argv является стандартным списком аргументов С — массив символьных указателей на строки аргументов, включая значение для использования с
argv[0]
[90] , завершающийся указателем
NULL
.

90

См. 9.1.4.3 Имена программ и

argv[0]
Примеч. науч. ред.

envp
является окружением для использования новым процессом, с таким же форматом, как глобальная переменная
environ
(см. раздел 2.4 «Переменные окружения»). В новой программе это окружение становится начальным значением
environ
.

Программа не должна возвращаться из вызова

exec
. Если она возвращается, возникла проблема. Чаще всего либо не существует затребованная программа, либо она существует, но не является исполняемой (значения для
errno ENOENT
и
EACCESS
соответственно). Может быть множество других ошибок; см. справочную страницу execve(2).

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

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Искатель 3

Шиленко Сергей
3. Валинор
Фантастика:
попаданцы
рпг
фэнтези
5.00
рейтинг книги
Искатель 3

Я – Легенда

Гарцевич Евгений Александрович
1. Я - Легенда!
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
5.00
рейтинг книги
Я – Легенда

Имперец. Том 1 и Том 2

Романов Михаил Яковлевич
1. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 1 и Том 2

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Неудержимый. Книга XIX

Боярский Андрей
19. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIX

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Первый среди равных. Книга VI

Бор Жорж
6. Первый среди Равных
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VI

Газлайтер. Том 3

Володин Григорий
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

На границе империй. Том 10. Часть 2

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 10. Часть 2

Герой

Мазин Александр Владимирович
4. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Герой

На обочине 40 плюс. Кляча не для принца

Трофимова Любовь
Проза:
современная проза
5.00
рейтинг книги
На обочине 40 плюс. Кляча не для принца

Язычник

Мазин Александр Владимирович
5. Варяг
Приключения:
исторические приключения
8.91
рейтинг книги
Язычник