Petruczynik

Post on 07-Jun-2015

110 views 2 download

description

sprawko z 5 laborek

Transcript of Petruczynik

SYSTEMY OPERACYJNE

SPRAWOZDANIE Z ĆWICZENIA LABORATORYJNEGO NR 5

Grupa: I6Y1S1 Rafał Petruczynik

Data wykonania ćwiczenia: 02.04.2008

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ę

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;

}