Вход/Регистрация
Linux программирование в примерах
вернуться

Роббинс Арнольд

Шрифт:

#include <sys/resource.h>

#include <sys/wait.h>

pid_t wait3(int *status, int options, struct rusage *rusage);

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

Переменная

status
та же, что и для
wait
и
waitpid
. Все описанные ранее макросы (
WIFEXITED
и т.д.) могут использоваться и с ними.

Значение

options
также то же самое, что и для
waitpid
: либо 0, либо побитовое ИЛИ с одним или обоими флагами
WNOHANG
и
WUNTRACED
.

wait3
ведет себя подобно
wait
, получая сведения о первом доступном порожденном зомби, a
wait4
подобна
waitpid
, получая сведения об определенном процессе. Обе функции возвращают PID потомка, -1 при ошибке или 0, если нет доступных процессов и был использован флаг
WNOHANG
. Аргумент
pid
может принимать те же значения, что и аргумент
pid
для
waitpid
.

Ключевым отличием является указатель

struct rusage
. Если он не равен
NULL
, система заполняет ее сведениями о процессе. Эта структура описана в POSIX и в справочной странице getrusage(2):

struct rusage {

 struct timeval ru_utime; /* используемое время пользователя */

 struct timeval ru_stime; /* используемое системное время */

 long ru_maxrss; /* максимальный размер резидентного набора */

 long ru_ixrss; /* общий размер разделяемой памяти */

 long ru_idrss; /* общий размер не разделяемых данных */

 long ru_isrss; /* общий размер не разделяемого стека */

 long ru_minflt; /* использование страниц */

 long ru_majflt; /* ошибок страниц */

 long ru_nswap; /* подкачек */

 long ru_inblock; /* блочных операций ввода */

 long ru_oublock; /* блочных операций вывода */

 long ru_msgsnd; /* посланных сообщений */

 long ru_msgrcv; /* полученных сообщений */

 long ru_nsignals; /* полученных сигналов */

 long ru_nvcsw; /* добровольных переключений контекста */

 long ru_nivcsw; /* принудительных переключений контекста */

};

Чисто BSD системы (4.3 Reno и более поздние) поддерживают все поля. В табл. 9.2 описаны доступность различных полей

struct rusage
для POSIX и Linux.

Таблица 9.2. Доступность полей

struct rusage

Поле POSIX Linux Поле POSIX Linux
ru_utime
√ ≥ 2.4
ru_nswap
≥2.4
ru_stime
√ ≥2.4
ru_nvcsw
≥2.6
ru_minflt
≥2.4
ru_nivcsw
≥2.6
ru_majflt
≥2.4

Стандартом определены лишь поля, помеченные «POSIX». Хотя Linux определяет полную структуру, ядро 2.4 поддерживает лишь поля времени пользователя и системного времени. Ядро 2.6 поддерживает также поля, связанные с переключением контекста. [92]

92

Дважды проверьте справочную страницу getrusage(2), если у вас более новое ядро, поскольку это поведение, возможно, изменилось — Примеч. автора.

Наиболее интересными полями являются

ru_utime
и
ru_stime
, использование времени процессора в режиме пользователя и ядра соответственно. (Время процессора в режиме пользователя является временем, потраченным на исполнение кода уровня пользователя. Время процессора в режиме ядра является временем, потраченным в ядре в пользу процесса.)

Эти два поля используют

struct timeval
, которая содержит значения времени с точностью до микросекунд. Дополнительные сведения по этой структуре см. в разделе 14.3.1 «Время в микросекундах:
gettimeofday
».

В BSD 4.2 и 4.3 аргумент

status
функций
wait
и
wait3
был
union wait
. Он умещался в
int
и предоставлял доступ к тем же сведениям, которые выдают современные макросы
WIFEXITED
и др., но через членов объединения. Не все члены были действительными во всех случаях. Эти члены и их использование описаны в табл. 9.3.

Таблица 9.3.

union wait
4.2 и 4.3 BSD

Макрос POSIX Член объединения Использование Значение
WIFEXITED
w_termsig
w.w_termsig == 0
True при нормальном завершении
WEXITSTATUS
w_retcode
code = w.w_retcode
Статус завершения, если не по сигналу
WIFSIGNALED
w_termsig
w.w_temsig != 0
True, если завершен по сигналу
WTERMSIG
w_termsig
sig = w.w_termsig
Сигнал, вызвавший завершение
WIFSTOPPED
w_stopval
w.w_stopval == WSTOPPED
True, если остановлен
WSTOPSIG
w_stopsig
sig = w.w_stopsig
Сигнал, вызвавший остановку
WCOREDUMP
w_coredump
w.w_coredump != 0
True, если потомок сделал снимок образа
  • Читать дальше
  • 1
  • ...
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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