• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

fork() i pid procesu Linux

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+2 głosów
1,779 wizyt
pytanie zadane 6 stycznia 2016 w C i C++ przez Wilier Bywalec (2,570 p.)
Hej,

mam pytanie do funkcji fork() oraz getpid() (programowanie pod Linuxa).

Mamy uruchomiony jakieś program (proces). Odpalam funkcje fork(). Ów proces się rozdziela na 2 procesy.

1 to ten stary (rodzic), a 2 to dziecko, które jest kopią rodzica. Rodzic otrzymuje PID dziecka, a dziecko ma PID =0.

I teraz nie rozumiem, jak to dziecko może mieć PID 0. Gdy robię test typu if(pid>0) to rodzic, a else to dziecko

Tylko problem jest taki, że gdy w ifie pobiorę getpid() to rodzic ma jakieś PID i dziecko też ma już PID różny od 0.

Wiec czy kiedykolwiek proces bedzie mial pid=0?

3 odpowiedzi

0 głosów
odpowiedź 6 stycznia 2016 przez Ehlert Ekspert (215,010 p.)
Z tego co mi wiadomo to te dwa procesy będą miały różny PID. Z kolei dziecko będzie mieć PPID == PID_rodzica.
0 głosów
odpowiedź 6 stycznia 2016 przez nouveu Bywalec (2,560 p.)

Robiłem to jakiś czas temu i w praktyce wygląda to następująco:

{
    // kod rodzica
    if (fork()==0)
    {
	    // to wykona tylko proces potomny, niezależnie jaki ma pid
	    return; // koniec pracy dziecka
    }
    // to wykona rodzic równolegle z potomkiem (dziecko też jeśli zapomnisz o return)
   return; // koniec pracy rodzica
}

Też miałem tą samą wątpliwość co ty, że PID nie wynosi 0 ale nie znalazłem odpowiedzi, zrobiłem jak powyżej i działało. Jeśli ktoś bardziej ogarnia to sam chętnie też się dowiem co i jak.

 

komentarz 6 stycznia 2016 przez Wilier Bywalec (2,570 p.)
no wlasnie i w środku ifa będzie proces potomny, a poza nim pracę kontynuuje proces rodzic,

tylko, że jeśli w środku pętli zrobimy getpid() to on jest różny od 0, a każda definicja mówi, że proces potomny ma pid =0

i tego nie rozumiem
0 głosów
odpowiedź 7 lutego 2016 przez mbabane Szeryf (79,260 p.)

pid = fork()

proces rodzic dostaje tutaj pid dziecka, a dziecko ma wartość zero. Zero chyba tylko po to żeby w programie można było odróżnić dziecko od rodzica, faktyczny pid będzie inny. fork() tworzy kopie/duplikat tego samego programu, gdybyśmy nie dali if (pid == 0) to najpierw rodzic wykonałby cały kod potomka, a potem swój, a faktyczny proces potomny wykonałby dokładnie to samo (oczywiście oba procesy mniej-więcej w tym samym czasie tj. współbieżnie).

Tak więc aby tak nie było fork() dla procesu potomnego daje 0, żeby program mógł rozróżnić go od rodzica, a rodzic dostaje pid dziecka.

Podobne pytania

0 głosów
2 odpowiedzi 663 wizyt
pytanie zadane 1 grudnia 2016 w C i C++ przez bart1996 Początkujący (360 p.)
0 głosów
1 odpowiedź 1,035 wizyt
pytanie zadane 11 stycznia 2019 w C i C++ przez poldeeek Mądrala (5,980 p.)
0 głosów
1 odpowiedź 1,048 wizyt

93,434 zapytań

142,429 odpowiedzi

322,664 komentarzy

62,799 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...