Zadanie z laboratorium QNX, problem z rozwiązaniem

0

Witam

Treść zadania przedstawia się następująco:

Napisz program, który oprócz procesu macierzystego tworzy trzy procesy potomne. Każdy proces powinien wyświetlać swój numer (1-3) oraz identyfikator losową ilość razy (max 5) w odstępie jednej sekundy. Program napisz w jednym pliku.

Kod:


#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char* argv[]) {

pid_t pp, pm;
int i,j,max;

pm = getpid();

for(i=1; i<4; i++) {

       max = (rand()%5)+1;
       pp = fork();
         
         if (pp==0) {

                for(j=0; j<max; j++) {

                             printf("Jestem procesem %u: posiadajacym id: %u", i, getpid());
                             sleep(1);
                }
       } else {

          printf("%u: macierzysty, potomny to %u\n", pm, pp);

       }
}

return 0;

}

A zrzut ekranu z wyniku działania tego programiku

http://img511.imageshack.us/img511/6844/zrzutee0.jpg

Dlaczego proces macierzysty utworzył tyle procesów potomnych??
I dlaczego tak pieprzy się kolejność procesów w pętli:/?

Pozdrawiam

0

to nie proces mać. ich tyle utworzyl, tylko potomne tez tworzyly Ci nowe procesy.

zwroc uwage ze FORK robi DOKLADNA KOPIE procesu, z roznica jedynie w wartosci zwracanej z fork'a. to oznacza, ze jesli w obiegu i=2gim glownej petli zrobisz fork'a, to proces-dziecko jak juz sie stworzy, bedzie w TYM SAMYM STANIE, czyli bedzie tez siedzialo w glownej petli z i=2.. jedynie pp u niego bedzie zero

rozwiazanie jest banalne: po wykryciu ze proces jest dzieckiem, nalezy zerwac glowna petle

main()
{
    for(...)
    {
         if(fork()==0)
         {     //do child's work
               ????; //BREAK the loop, or even RETURN from the main
         }
         else
         {    //do parent's work
               // continue to loop!
         }
    }
}
0

dzięki za pomoc, problem już rozwiązany, pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1