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

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

Жанры

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

Если родительский процесс завершается, порожденный получает нового родителя,

init
. В этом случае PID родителя будет 1, что является PID
init
. Такой порожденный процесс называется висячим (orphan). Следующая программа,
ch09-reparent.с
, демонстрирует это. Это также первый пример
fork
в действии:

1 /* ch09-reparent.c --- показывает, что getppid может менять значения */

2

3 #include <stdio.h>

4 #include <errno.h>

5 #include <sys/types.h>

6 #include <unistd.h>

7

8 /* main --- осуществляет работу */

9

10 int main(int argc, char **argv)

11 {

12 pid_t pid, old_ppid, new_ppid;

13 pid_t child, parent;

14

15 parent = getpid; /* перед fork */

16

17 if ((child = fork) < 0) {

18 fprintf(stderr, "%s: fork of child failed: %s\n",

19 argv[0], strerror(errno));

20 exit(1);

21 } else if (child == 0) {

22 old_ppid = getppid;

23 sleep(2); /* см. главу 10 */

24 new_ppid = getppid;

25 } else {

26 sleep(1);

27 exit(0); /* родитель завершается после fork */

28 }

29

30 /* это выполняет только порожденный процесс */

31 printf("Original parent: %d\n", parent);

32 printf("Child: %d\n", getpid);

33 printf("Child's old ppid: %d\n", old_ppid);

34 printf("Child's new ppid: %d\n", new_ppid);

35

36 exit(0);

37 }

Строка 15 получает PID начального процесса, используя

getpid
. Строки 17–20 создают порожденный процесс, проверяя по возвращении ошибки.

Строки 21–24 выполняются порожденным процессом: строка 22 получает PPID. Строка 23 приостанавливает процесс на две секунды (сведения о

sleep
см в разделе 10.8.1 «Аварийные часы:
sleep
,
alarm
и
SIGALRM
»), а строка 24 снова получает PPID.

Строки 25–27 исполняются в родительском процессе. Строка 26 задерживает родителя на одну секунду, давая порожденному процессу достаточно времени для осуществления первого вызова

getppid
. Строка 27 завершает родителя.

Строки 31–34 выводят значения. Обратите внимание, что переменная

parent
, которая была установлена до разветвления, сохраняет свое значение в порожденном процессе. После порождения у двух процессов идентичные, но независимые копии адресного пространства. Вот что происходит при запуске программы:

$ ch09-reparent /* Запуск программы */

$ Original parent: 6582 /* Программа завершается: приглашение оболочки

и вывод порожденного процесса */

Child: 6583

Child's old ppid: 6582

Child's new ppid: 1

Помните, что обе программы выполняются параллельно. Графически это изображено на рис. 9.2.

Рис. 9.2. Два параллельно исполняющихся процесса после разветвления

ЗАМЕЧАНИЕ. Использование

sleep
, чтобы заставить один процесс пережить другой, работает в большинстве случаев. Однако, иногда случаются ошибки, которые трудно воспроизвести и трудно обнаружить. Единственным способом гарантировать правильное поведение является явная синхронизация с помощью
wait
или
waitpid
, которые описываются далее в главе (см. раздел 9.1.6.1 «Использование функций POSIX:
wait
и
waitpid
»).

9.1.3. Установка приоритетов процесса:

nice

Когда процессы запущены, ядро динамически меняет приоритет каждого процесса. Как и в жизни, элементы с большим приоритетом получают внимание до элементов с меньшим приоритетом. Короче говоря, каждому процессу выделяется небольшая порция времени для исполнения, которая называется квантом времени (time slice). Когда квант истекает, если текущий процесс все еще является процессом с наивысшим приоритетом, ему разрешается продолжать.

Linux, как и Unix, обеспечивает вытесняющую многозадачность. Это означает, что ядро может вытеснить процесс (приостановить его), если настало время дать возможность поработать другому процессу. Приоритет длительное время работающих процессов (например, процессов, выполняющих интенсивные вычисления), снижается в конце их кванта времени, поэтому они дают шанс другим процессам получить время процессора. Сходным образом, процессам, длительное время бездействовавшим в ожидании завершения ввода/вывода (таким, как интерактивный текстовый редактор), приоритет повышается, так что они могут ответить на ввод/вывод, когда он происходит. Короче, ядро гарантирует, что все процессы, усредненные по времени, получают свою «справедливую долю» времени процессора. Повышение и понижение приоритетов является частью этого процесса.

Проектирование хорошего планировщика процессов для ядра является искусством; практические подробности выходят за рамки данной книги. Однако, процесс может влиять на назначения приоритетов ядром посредством своего значения относительного приоритета (nice).

Значение относительного приоритета является указанием того, насколько «приятным» хочет быть процесс в отношении других процессов. В соответствии с этим большие значения означают во все большей степени терпеливые процессы; т.е. те, которые все более приятны другим, снижая свой приоритет по отношению к ним.

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

Открытие мира (Весь роман в одной книге)

Смирнов Василий Александрович
Проза:
классическая проза
русская классическая проза
советская классическая проза
5.00
рейтинг книги
Открытие мира (Весь роман в одной книге)

"Фантастика 2024-21". Компиляция. Книги 1-21

Суржевская Марина
Фантастика 2024. Компиляция
Фантастика:
боевая фантастика
детективная фантастика
попаданцы
5.00
рейтинг книги
Фантастика 2024-21. Компиляция. Книги 1-21

Библия. Новый русский перевод

Коллектив авторов
Религия и эзотерика:
христианство
6.57
рейтинг книги
Библия. Новый русский перевод

Фауст

фон Гёте Иоганн Вольфганг
50. Библиотека всемирной литературы
Поэзия:
драматургия
8.33
рейтинг книги
Фауст

Практические основы кулинарного искусства. Краткий популярный курс мясоведения

Игнатьев Михаил
Дом и Семья:
кулинария
6.25
рейтинг книги
Практические основы кулинарного искусства. Краткий популярный курс мясоведения

Собрание сочинений (Том 1)

Лиханов Альберт Анатольевич
Детские:
прочая детская литература
5.00
рейтинг книги
Собрание сочинений (Том 1)

Средневековая история. Тетралогия

Гончарова Галина Дмитриевна
Средневековая история
Фантастика:
фэнтези
попаданцы
9.16
рейтинг книги
Средневековая история. Тетралогия

Тактика победы

Кутузов Михаил Илларионович
Великие полководцы
Документальная литература:
биографии и мемуары
6.25
рейтинг книги
Тактика победы

#Бояръ-Аниме. Газлайтер. Том 13

Володин Григорий Григорьевич
13. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
фэнтези
7.33
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 13

Золото бунта

Иванов Алексей Викторович
Приключения:
исторические приключения
7.50
рейтинг книги
Золото бунта

Молот Пограничья. Гексалогия

Пылаев Валерий
Молот Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.25
рейтинг книги
Молот Пограничья. Гексалогия

Сердце Дракона. Том 10

Клеванский Кирилл Сергеевич
10. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.14
рейтинг книги
Сердце Дракона. Том 10

В лапах зверя

Зайцева Мария
1. Звериные повадки Симоновых
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
В лапах зверя

Барон Бранд Берс. Том 3

Limonad
3. Бранд Берс
Проза:
магический реализм
5.00
рейтинг книги
Барон Бранд Берс. Том 3