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

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

Жанры

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

513 /* Вырезать таблицу имен из файла PATH.

514 Мы могли бы сначала вытащить из файла магическое число

515 для определения, нужно ли вырезать, но заголовочные файлы и

516 магические числа варьируют от системы к системе так сильно, что

517 сделать его переносимым было бы очень трудно. Не стоит усилий. */

518

519 static void

520 strip (const char *path)

521 {

522 int status;

523 pid_t pid = fork;

524

525 switch (pid)

526 {

527 case -1:

528 error(EXIT_FAILURE, errno, _("fork system call failed"));

529 break;

530 case 0: /*
Порожденный. */

531 execlp("strip", "strip", path, NULL);

532 error(EXIT_FAILURE, errno, _("cannot run strip"));

533 break;

534 default: /* Родитель. */

535 /* Родительский процесс. */

536 while (pid != wait(&status)) /* Ждать завершения потомка. */

537 /* Ничего не делать. */ ;

538 if (status)

539 error(EXIT_FAILURE, 0, _("strip failed"));

540 break;

541 }

542 }

Строка 523 вызывает

fork
. Затем оператор
switch
предпринимает нужное действие для возвращения ошибки (строки 527–529), порожденного процесса (строки 530–533) и родительского процесса (строки 534–539).

Стиль строк 536–537 типичен; они ожидают завершения нужного порожденного процесса. Возвращаемое значение wa

it
является PID этого потомка. Оно сравнивается с PID порожденного процесса,
status
проверяется лишь на предмет равенства нулю (строка 538), в случае ненулевого результата потомок завершился неудачно. (Тест, хотя и правильный, грубый, но простой. Более правильным был бы тест наподобие '
if (WIFEXITED(status) && WEXITSTATUS(status) != 0)
'.)

Из описаний и кода, представленных до сих пор, может показаться, что родительские программы должны выбрать определенный момент, чтобы ожидать завершения любого порожденного процесса, возможно, с опросом в цикле (как делает

install.c
), ожидая всех потомков. В разделе 10.8.3 «Родительский надзор: три различные стратегии» мы увидим, что это необязательно. Скорее, сигналы предоставляют ряд механизмов для использования уведомлениями родителей о завершении порожденных процессов.

9.1.6.2. Использование функций BSD:

wait3
и
wait4

Системные

вызовы BSD
wait3
и
wait4
полезны, если вы интересуетесь ресурсами, использованными порожденным процессом. Функции нестандартны (что означает, что они не являются частью POSIX), но широко доступны, в том числе на GNU/Linux. Объявления следующие:

#include <sys/types.h> /* Обычный */

#include <sys/time.h>

 /* Под GNU/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; /* блочных операций ввода */

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

Наследие Маозари 2

Панежин Евгений
2. Наследие Маозари
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Наследие Маозари 2

Проводник

Кораблев Родион
2. Другая сторона
Фантастика:
боевая фантастика
рпг
7.41
рейтинг книги
Проводник

Кодекс Охотника. Книга XXXII

Винокуров Юрий
32. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXII

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Петля, Кадетский корпус. Книга третья

Алексеев Евгений Артемович
3. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский корпус. Книга третья

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

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

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Тайны затерянных звезд. Том 3

Лекс Эл
3. Тайны затерянных звезд
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Тайны затерянных звезд. Том 3

Наномашины, ученик! Том 6

Новиков Николай Васильевич
6. Первый среди карапузов
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наномашины, ученик! Том 6

Я граф. Книга XII

Дрейк Сириус
12. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я граф. Книга XII

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Звездная Кровь. Экзарх I

Рокотов Алексей
1. Экзарх
Фантастика:
боевая фантастика
рпг
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Звездная Кровь. Экзарх I

География растений

Гумбольдт Александр
Классики естествознания
Научно-образовательная:
ботаника
7.50
рейтинг книги
География растений

Ермак. Противостояние. Книга одиннадцатая

Валериев Игорь
11. Ермак
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Ермак. Противостояние. Книга одиннадцатая