Разработка приложений в среде Linux. Второе издание
Шрифт:
Второй член структуры —
10.4. Примитивы процессов
Несмотря на относительно длинную дискуссию, необходимую для описания процесса, создание и уничтожение процессов в Linux достаточно просто.
10.4.1.
В Linux предусмотрены два системных вызова, которые создают новые процессы:
Этот системный вызов имеет уникальное свойство возвращать управление не один раз, а дважды: один раз в родительском процессе и другой — в дочернем. Обратите внимание, что мы не говорим "первый — в родительском" — написание кода, который делает какие-то предположения относительно предопределенного порядка — очень плохая идея.
Каждый из двух возвратов системного вызова
Разница возвращаемых значений — это единственное отличие, видимое процессам. Оба имеют одинаковые образы памяти, права доступа, открытые файлы и обработчики сигналов [19] . Рассмотрим простой пример программы, порождающей дочерний процесс.
19
Детальную информацию о том, как родительские и дочерние открытые файлы соотносятся друг с другом, можно найти в главе 11.
10.4.2. Наблюдение за уничтожением дочерних процессов
Сбор состояний возврата дочернего процесса называется ожиданием процесса. Это можно делать четырьмя способами, хотя только один из вызовов предоставляется ядром. Остальные три метода реализованы в стандартной библиотеке С. Поскольку системный вызов ядра принимает четыре аргумента, он называется
Первый аргумент,
20
Группы процессов рассматриваются далее в этой главе
Второй параметр — это указатель на целое, которое устанавливается в значение, равное соду возврата того процесса, который заставляет
Три события заставляют
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 . |
Аргумент
Финальный параметр
Существуют три других интерфейса к
pid_t wait(int *status) | Единственный параметр wait — это указатель на место, куда следует поместить код возврата прерванного процесса. Эта функция всегда блокирует выполнение до тех пор, пока дочерний процесс не будет прерван. |
pid_t waitpid (pid_t pid, int *status, int options) | Функция waitpid подобна wait4 . Единственное отличие в том, что она не возвращает информации об использовании ресурсов прерванным процессом. |
pid_t wait3(int *status, int options, struct rusage *rusage) | Эта функция также подобна wait4 , но не позволяет специфицировать дочерний процесс, который должен быть проверен. |