Process-father

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() или получил сигнал на завершение. Ядро освобождает ресурсы, связанные с процессом, кроме кода возврата и статистики выполнения.Далее процесс переходит в состоянии зомби, т.е. Не работает, а завершает работу,а затем уничтожается.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: