АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Процессы-зомби

Применение вызова fork() для создания процессов может оказаться очень полезным, но необходимо отслеживать дочерние процессы. Когда дочерний процесс завершается, связь его с родителем сохраняется до тех пор, пока родительский процесс в свою очередь не завершится нормально, или не вызовет wait(). Следовательно, запись о дочернем процессе не исчезает из таблицы процессов немедленно. Становясь неактивным, дочерний процесс все еще остается в системе, поскольку его код завершения должен быть сохранен, на случай если родительский процесс в дальнейшем вызовет wait. Он становится умершим или процессом-зомби. Процесс-зомби – это процесс, у которого отобраны все ресурсы, кроме последнего – строки в таблице процессов.

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

 

 

Передать значение окружению программы может глобальная переменная environ. Другой вариант — дополнительный аргумент в функцияхexecle и execve, способный передавать строки, используемые как окружение новой программы.

Если вы хотите применить функцию exec для запуска программы ps, можно выбирать любую функцию из семейства exec, как показано в вызовах приведенного далее фрагмента программного кода:

#include <unistd.h>

/* Пример списка аргументов */

 

/* Учтите, что для argv[0] необходимо имя программы */

char *const ps_argv[] = {"ps", "ax", 0};

/* He слишком полезный пример окружения */

char *const ps_envp[] = {"PATH=/bin:/usr/bin", "TERM=console", 0};

/* Возможные вызовы функций exec */

execl("/bin/ps", "ps", "ax", 0);

/* предполагается, что ps в /bin */

execlp("ps", "ps", "ax", 0);

/* предполагается, что /bin в PATH */

execle("/bin/ps", "ps", "ax", 0, ps_envp);

/* передается свое окружение */

execv("/bin/ps", ps_argv);

execvp("ps", ps_argv);

execve("/bin/ps", ps_argv, ps_envp);

 

Задание 3:

Написать программу, в которой процесс-потомок вызывает системный вызов exec(), а процесс-предок ждет завершения процесса-потомка.

 


1 | 2 | 3 | 4 | 5 | 6 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)