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

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

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

struct rlimit {

 long int rlim_cur; /* мягкое ограничение */

 long int rlim_max; /* жесткое ограничение */

};

Второй член структуры —

rlim_max
, указывает жесткое ограничение лимита, переданного в параметре
resource
, a
rlim_cur
— мягкое ограничение. Это те же наборы лимитов, которыми манипулируют команды
ulimit
и
limit
, одна из которых встроена в большинство командных оболочек.

10.4. Примитивы процессов

Несмотря на относительно длинную дискуссию, необходимую

для описания процесса, создание и уничтожение процессов в Linux достаточно просто.

10.4.1. Создание дочерних процессов

В Linux предусмотрены два системных вызова, которые создают новые процессы:

fork
и
clone
. Как упоминалось ранее,
clone
используется для создания потоков, и этот вызов будет кратко описан далее. А сейчас мы сосредоточимся на
fork
— наиболее популярном методе создания процессов.

#include <unistd.h>

pid_t fork(void);

Этот системный вызов имеет уникальное свойство возвращать управление не один раз, а дважды: один раз в родительском процессе и другой — в дочернем. Обратите внимание, что мы не говорим "первый — в родительском" — написание кода, который делает какие-то предположения относительно предопределенного порядка — очень плохая идея.

Каждый из двух возвратов системного вызова

fork
имеет разные значения. В родительский процесс этот системный вызов возвращает pid вновь созданного дочернего процесса, а в дочернем он возвращает 0.

Разница возвращаемых значений — это единственное отличие, видимое процессам. Оба имеют одинаковые образы памяти, права доступа, открытые файлы и обработчики сигналов [19] . Рассмотрим простой пример программы, порождающей дочерний процесс.

#include <sys/types.h>

#include <stdio.h>

#include <unistd.h>

int main(void) {

 pid_t child;

19

Детальную информацию о том, как родительские и дочерние открытые файлы соотносятся друг с другом, можно найти в главе 11.

 if (!(child = fork)) {

printf("в дочернем\n");

exit (0);

 }

 printf("в родительском - дочерний: %d\n", child);

 return 0;

}

10.4.2. Наблюдение за уничтожением дочерних процессов

Сбор состояний возврата дочернего процесса называется ожиданием процесса. Это можно делать четырьмя способами, хотя только один из вызовов предоставляется ядром. Остальные три метода реализованы в стандартной библиотеке С. Поскольку системный вызов ядра принимает четыре аргумента, он называется

wait4
.

pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);

Первый аргумент,

pid
, представляет собой процесс, код возврата которого должен быть возвращен. Он может принимать ряд специальных значений.

pid < -1
Ожидать завершения любого дочернего процесса, чей pgid равен абсолютному значению
pid
.

pid = -1
Ожидать прерывания любого дочернего процесса.

pid = 0
Ожидать завершения дочернего из той же группы процессов, что и текущий [20]
.

20

Группы

процессов рассматриваются далее в этой главе

pid > 0
Ожидать выхода процесса
pid
.

Второй параметр — это указатель на целое, которое устанавливается в значение, равное соду возврата того процесса, который заставляет

wait4
вернуть управление (мы будем зазывать его "проверяемым" процессом). Формат возвращенного состояния довольно закрученный, и для того, чтобы сделать его осмысленным, существует набор макросов.

Три события заставляют

wait4
вернуть состояние проверяемого процесса. Процесс может завершиться, он может быть прерван вызовом
kill
(получит фатальный сигнал) либо он может быть остановлен по какой-либо причине [21] . Вы можете узнать, что именно случилось, с помощью описанных ниже макросов, каждый из которых принимает возвращаемое состояние
wait4
в качестве единственного параметра.

21

В главе 15 описаны причины, по которым это может произойти.

WIFEXITED(status)
Возвращает
true
, если процесс завершился нормально. Процесс завершается нормально, когда его функция
main
выходит из программы посредством вызова
exit
. Если
WIFEXITED
истинно, то
WEXITSTATUS(status)
возвращает код возврата процесса.
WIFSIGNALED(status)
Возвращает
true
, если процесс был прерван сигналом (это происходит, когда он прерывается вызовом
kill
). В этом случае
WTERMSIG(status)
возвращает номер сигнала, прервавшего процесс.
WIFSTOPPED(status)
Если процесс приостановлен сигналом,
WIFSTOPPED
возвращает
true
, a
WSTOPSIG(status)
возвращает номер сигнала, приостановившего процесс.
wait4
возвращает информацию только о приостановленных процессах, если указана опция
WUNTRACED
.

Аргумент

options
управляет поведением вызова.
WHOHANG
заставляет функцию немедленно вернуть управление. Если в данный момент нет ни одного процесса, готового сообщить свое состояние, то возвращается 0 вместо допустимого pid.
WUNTRACED
заставляет
wait4
возвратить соответствующий остановленный дочерний процесс. Более подробно о приостановленных процессах рассказывается в главе 15. Оба флажка могут быть объединены вместе битовой операцией "или".

Финальный параметр

wait4
, указатель на
struct rusage
, наполняется информацией об использовании ресурсов проверяемым процессом и всеми его потомками. Более подробная информация об этом давалась при обсуждении
getrusage
и
RUSAGE_BOTH
ранее в главе. Если этот параметр равен
NULL
, информация о состоянии не возвращается.

Существуют три других интерфейса к

wait4
, каждый из которых представляет подмножество его функциональности.

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

Как я строил магическую империю 4

Зубов Константин
4. Как я строил магическую империю
Фантастика:
боевая фантастика
постапокалипсис
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 4

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Попаданка 3

Ахминеева Нина
3. Двойная звезда
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка 3

Муж на сдачу

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Муж на сдачу

Призыватель нулевого ранга. Том 3

Дубов Дмитрий
3. Эпоха Гардара
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга. Том 3

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

INDIGO
23. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 5

Адвокат

Константинов Андрей Дмитриевич
1. Бандитский Петербург
Детективы:
боевики
8.00
рейтинг книги
Адвокат

На границе империй. Том 7

INDIGO
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
На границе империй. Том 7

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Бестужев. Служба Государевой Безопасности. Книга четвертая

Измайлов Сергей
4. Граф Бестужев
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга четвертая

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

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

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