Third
Process-father
Second
Process-father
First
Пример. Использование системного вызова wait().
В данном примере процесс-предок порождает два процесса, каждый из которых запускает команду echo. Далее процесс-предок ждет завершения своих потомков, после чего продолжает выполнение.
int main(int argc, char **argv)
{
if ((fork()) == 0) /*первый процесс-потомок*/
{ execl(“/bin/echo”,”echo”,”this is”,”string 1”,0);
exit(); }
if ((fork()) == 0) /*второй процесс-потомок*/
{ execl(“/bin/echo”,”echo”,”this is”,”string 2”,0);
exit(); }
/*процесс-предок*/
printf(“process-father is waiting for children\n”);
while(wait()!= -1);
printf(“all children terminated\n”);
exit();
}
В данном случае wait() вызывается в цикле три раза –первые два ожидают завершения процессов-потомков, последний вызов вернет неуспех, ибо ждать более некого.
Жизненный цикл процессов
1. Процесс только что создан посредством вызова fork().
2. Процесс находится в очереди готовых на выполнение процессов.
3. Процесс выполняется в режиме задачи, т.е. когда реализуется алгоритм, заложенный в программу. Выход из этого состояния может произойти через системный вызов, прерывание или завершение процесса.
|
|
4. Процесс может выполняться в режиме ядра ОС, т.е. когда по требованию процесса через системный вызов выполняются определенные инструкции ядра ОС или произошло другое прерывание.
5. Процесс в ходе выполнения не имеет возможность получить требуемый ресурс и переходит в состояние блокирования.
6. Процесс осуществил вызов exit() или получил сигнал на завершение. Ядро освобождает ресурсы, связанные с процессом, кроме кода возврата и статистики выполнения.Далее процесс переходит в состоянии зомби, т.е. Не работает, а завершает работу,а затем уничтожается.