Not logged in. · Lost password · Register
Forum: Fedora Programowanie i kompilacja RSS
Funkcja fork() / procesy potomne i macierzyste

Announcement

2006-06-03, 10:40 by gajownik
Subject: Zanim coś napiszesz...
Witamy w naszych niskich progach ;-)

Zanim coś napiszesz na forum:
1. zapoznaj się z Wiki i FAQ a także Poradnikiem - są tam odpowiedzi na najczęściej pojawiające się pytania
2. skorzystaj z forumowej wyszukiwarki i/lub Google - jest spora szansa, że ktoś już rozwiązał Twój problem
3. uaktualnij cały system
4. przeczytaj regulamin oraz tekst na temat mądrego zadawania pytań
5. jeśli masz jakiś problem, przekaż nam o nim odpowiednią ilość informacji - jak na razie nie potrafimy jeszcze wróżyć z fusów
6. dla każdego nowego problemu twórz osobny wątek używając jednak zdrowego rozsądku
7. nie pisz niczego, czego wstydził(a)byś się przed swoją mamą ;-)

Życzymy miłej zabawy - zespół fedorapl.org
Create new thread · Reply
Reply · Quote parsival #1 ()
since Oct 2007 · 46 posts
Group memberships: Użytkownicy
Show profile · Link to this post
Subject: Funkcja fork() / procesy potomne i macierzyste
NIe moge zrozumieć co właściwie dzieje się po uruchomieniu tego programu:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include<sys/wait.h>

int main(int argc, char **argr)
{
         int i=0;

         for(i=0;i<3;i++){
        
         switch(fork())
             {
                    case -1 : perror("Fork error "); exit(-1);break; //chyba jeżeli funkcja nie ma procesów potomnych
                    case 0:  sleep(1) ;printf("------- %lu \n", getpid());break; //funkcja sleep usypia przypadek case 0 na 1s
                                                                                 // proces potomny
                    default:  printf("+++++++++ %lu \n", getpid());//default jest wykonywany gdy nie zajdzie dopasowanie do żadnego case
                                                                   //proces macieżyst
                    wait(NULL); //czekanie na proces potomny
             }

          }

exit(0);
}
po wykonaniu dostaje:
[DAMIAN@DAMIAN ex01_02]$ ./fork.x
+++++++++ 3403
------- 3404
+++++++++ 3404
------- 3405
+++++++++ 3405
------- 3406
+++++++++ 3404
------- 3409
+++++++++ 3403
------- 3410
+++++++++ 3410
------- 3411
+++++++++ 3403
------- 3412

i moje pytanie:
1. Dlaczego są 3 procesy macierzyste 3403 a żadnych potomnych?
2. Dlaczego jest proces potomny 3412 a nie ma procesu macerzystego 3412?
3. I jak narysować drzewo procesów dla tego programu?(to chyb ma tak wyglądać tylko teraz jak za "o" wstawić numery    ptocesów??)
            o
            |__o
|           |                o
|_____|_______|__o
|            o
|_____|___o
|
|____o
|
|
o
Avatar
Reply · Quote DanseMakabre #2 ()
User title: The fallen one
since May 2006 · 166 posts · Location: Mielec → Kraków
Group memberships: Administratorzy, Użytkownicy, Zespół fedorapl.org
Show profile · Link to this post
Zadania za Ciebie nikt nie odrobi (;
Jedyna rzecz, która może sprawiać trudność, to totalne zaciemnienie tego kodu (dobry przykład dydaktyczny, ale tak się nie pisze!).
Program ma się sforkować trzy razy (poczynając od i = 0). Gdy jednak sforkuje się jeszcze raz zmienna i = 1, a więc dwa procesy zaczynają z i = 1. Potem więc znowu się fokujemy, i = 2 - z taką wartością zmiennej zaczynają już cztery procesy. 4 + 2 + 1 =7 - proste, prawda?

Jeśli nie wiesz jak zachowuje się kod zmień go tak, żebyś to wiedział. Spróbuj tej wersji:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include<sys/wait.h>

void printDistance(int i)
{
        int j;
        for(j=0; j<i; j++) printf("\t");

        return;
}

int main(int argc, char **argr)
{
         int i=0;

         for(i=0;i<3;i++){
       
         switch(fork())
             {
                    case -1 : perror("Fork error "); exit(-1);break; //chyba jeżeli funkcja nie ma procesów potomnych
                    case 0:  sleep(1); printDistance(i); printf("Child: [iter %d] [pid %lu] [parent pid %lu]\n", i, getpid(), getppid());break; //funkcja sleep usypia przypadek case 0 na 1s
                                                                                 // proces potomny
                    default: printDistance(i); printf("Parent: [iter %d] [pid %lu]\n", i,  getpid());//default jest wykonywany gdy nie zajdzie dopasowanie do żadnego case
                                                                   //proces macieżyst
                    wait(NULL); //czekanie na proces potomny
             }

          }

exit(0);
}
[Image: http://img131.imageshack.us/img131/6453/fedoracoregt6.jpg]
[Image: http://img160.imageshack.us/img160/1940/prisonbreak2id2.gif]
Reply · Quote parsival #3 ()
since Oct 2007 · 46 posts
Group memberships: Użytkownicy
Show profile · Link to this post
Bez Twojej pomocy to ja bym tego nigdy nie zrozumiał(5 godz. na to straciłem)! świetna metoda przyda się na przyszłość.
Naprawde wielkie dzięki!
Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Reply
Go to forum
Powered by Unclassified NewsBoard (© 2003-7 by Yves Goergen)
Current time: 2008-11-21, 15:08:57 (UTC +01:00)
Copyright © 2006 - 2007 fedorapl.org