Введение.
Лекция №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-а родительских процесса.