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

fork() i pid procesu Linux

Object Storage Arubacloud
+2 głosów
1,626 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 (212,670 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,280 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 538 wizyt
pytanie zadane 1 grudnia 2016 w C i C++ przez bart1996 Początkujący (360 p.)
0 głosów
1 odpowiedź 835 wizyt
pytanie zadane 11 stycznia 2019 w C i C++ przez poldeeek Mądrala (5,980 p.)
0 głosów
1 odpowiedź 521 wizyt

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...