Petruczynik

3
SYSTEMY OPERACYJNE SPRAWOZDANIE Z ĆWICZENIA LABORATORYJNEGO NR 5 Grupa: I6Y1S1 Rafal Petruczynik Data wykonania ćwiczenia: 02.04.2008

description

sprawko z 5 laborek

Transcript of Petruczynik

Page 1: Petruczynik

SYSTEMY OPERACYJNE

SPRAWOZDANIE Z ĆWICZENIA LABORATORYJNEGO NR 5

Grupa: I6Y1S1 Rafał Petruczynik

Data wykonania ćwiczenia: 02.04.2008

Page 2: Petruczynik

Rafał Petruczynik, I6Y1S1

- 2 -

Zadanie 1

Dla podanego kodu programu podać ilość utworzonych procesów oraz narysować ich drzewo.

main () {

fork ();

if (fork == 0)

if (fork == 0) fork ();

if (fork == 0) fork ();

pause;

}

Drzewo procesów:

W wyniku działania programu powstaną 23 procesy. Wykonanie polecenia fork() powołuje do życia nowy proces, który jest kopią procesu nadrzędnego. Przy powoływaniu kolejnych procesów nie zmienia się ich nazwa. Zmienia się za to PID i PPID.

Do poprawnego działania programu konieczne jest zagnieżdżanie instrukcji. Nieostrożne stosowanie polecenia fork() może doprowadzić do załamania systemu. Sześć wywołań funkcji fork() w powyższym programie utworzyło aż 23 nowe procesy. Gdyby nie było zagnieżdżenia ta liczba byłaby większa. Łatwo sobie wyobrazić proces lawinowego tworzenia kopii procesów w przypadku popełnienia błędu przez programistę

Page 3: Petruczynik

Rafał Petruczynik, I6Y1S1

- 3 -

Zadanie 2

Napisać prosty interpreter poleceń, który wykona programy bezargumentowe (Np. ls, pwd, who). Ma wczytywać znaki z klawiatury. W programie należy wykorzystać funkcję exec. Z racji tego, że programy mają być bezargumentowe można posłużyć się funkcją execlp z parametrem NULL. Dodatkowo aby nie uruchamiać każdorazowo interpretera, pracuje on w nieskończonej pętli. Program zakończy się po wprowadzeniu polecenia quit.

int main()

{

char buf[MAXB];

int status;

while(1)

{

printf("%% ");

scanf("%s",buf);

buf[strlen(buf)] = 0;

if (!strcmp (buf,"quit"))

{

printf ("\n\n");

printf (“Zakonczono.”);

exit(0);

}

if (fork() == 0) execlp(buf,buf,NULL);

wait (&status);

printf ("Exit status: %d\n",status);

}

return 0;

}