Введение.


Лекция №1

Управление процессами в среде UNIX

ВТОРОЙ СЕМЕСТР

 

B – это процесс, который запускает процесс Е

Е – это дочерний процесс

Процесс В по отношению к процессу Е – родительский

1) Родительский процесс, запустив дочерний процесс, должен дождаться кода возврата. (Казус: Если G завершится без завершения Н, то процесс Н будет переведен в поддерево Init)

2) Если Е завершится, но В не получит код возврата, то процесс Е будет называться зомби процессом.

3) Система порождения процессов специфична из-за потоков, которые перекрывают адресное пространство

Единственная возможность создания нового процесса – это создать полную копию уже запущенного процесса

pid_t fork () – создание копии


void main()

{

fork ();

cout<<”1”;

}

Для родителя fork() возвращает номер дочернего процесса, а для дочернего процесса fork() возвращает 0.

 

Void main ()

{

Cout << fork()<<endl;

}

 

На экран будет выведено два числа:

1) 0

2) Любое число > 0

 

Void main ()

{

if(fork()==0)

cout <<”1”; else

cout <<”2”;

}

 

На экране появится и 1, и 2.

int exec *(…) – запуск внешней программы

exec запускает внешнюю программу, замещая ей текущую. Возвращает код ошибки (т.к. она замещает текущую программу, то любой возврат int надо рассматривать как ошибку)

Если «дочка»:

void main()

{

if(fork()==0)

{

exec(“…”); //запуск

exit(1); //внешней программы

}…

}

Если exec – ошибка, т.е. «дочка» не смогла запустить процесс и exit не будет – в результате получим 2-а родительских процесса.