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

[C] Fork () <- Ostatnia linijka wykonuje sie 3 razy (a nie raz)

Object Storage Arubacloud
+3 głosów
368 wizyt
pytanie zadane 2 września 2016 w C i C++ przez ShiroUmizake Nałogowiec (46,300 p.)

Zadanie: Stwórz drzewo procesów następujący sposób:

  - 3 - 4
1
  - 2- 5

Każdy proces uśpij . Główny proces ma czekać na zakończenie procesu dzieci.

Kod:

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

int main (void){
pid_t child_a, child_b;

child_a = fork();

if (child_a == 0) {
    printf ("Process 2 \n");
    sleep(10);
	pid_t child = fork();
	if (child == 0){
	printf ("Process 3");
	sleep(10);
	}
	else{
	wait(NULL);
	}
}
 else {
	printf("Process 1 /n");
    child_b = fork();

    if (child_b == 0) {
        /* Child B code */
        printf("Process 4 \n");
        sleep(10);
        pid_t child1 = fork();
        if (child1 == 0 ){
			printf ("Process 5 \n");
			sleep(10);
		}
		else {
		wait (NULL);
		}
        //ParentChild Code
    }
    wait(NULL);
    printf ("Process Ended...\n");
    
}
	
}

I wszystko pięknie się robi, ale nie wiem dlaczego zawsze drukuje process ended gdy jakikolwiek sie zakonczy. A nie wiem jak to naprawic. Ma ktos jakieś pomysły?

1 odpowiedź

0 głosów
odpowiedź 2 września 2016 przez mrcnsct Nałogowiec (36,390 p.)
Nie wiem czy dobrze rozumiem to drzewo procesów, które podałeś, ale wydaje mi się, że wynika z niego, że proces 1 ma mieć dwa procesy potomne o numerach 2 i 3. Proces 2 ma mieć potomka o numerze 5, a proces 3 potomka o numerze 4. Z tego co Ty zrobiłeś wynika, że proces 1 ma potomków 2 i 4, proces 2 ma potomka 3, a proces 4 ma potomka 5. Tak więc ja bym nadał numery w printf: patrząc od góry 2,5,1,3,4.

printf z process ended masz w bloku else, który zaczyna się w 26 linijce i kończy w 47. Wykonuje się on 3 razy, ponieważ w tym bloku else są 3 procesy. Według Twojego numerowania: 1,4,5. Nie kończysz wcześniej procesów 4 i 5, więc one także dochodzą do tego momentu. Na końcu bloku if, który zaczyna się w linijce 30 napisz return 0, aby w tym miejscu zakończyły się procesy 4 i 5.

W 44 linijce masz wait(NULL), ale przydałoby się napisać to jeszcze raz, bo proces 1 ma dwóch potomków, powinien więc poczekać na obu, a nie tylko na jednego. Brakuje też return 0 na koniec programu i masz zły ukośnik w printf process1. Niezbyt czytelne formatowanie kodu. (np. dlaczego wnętrze if z linijki 18 nie ma wcięcia względem tego if?).
1
komentarz 5 września 2016 przez ShiroUmizake Nałogowiec (46,300 p.)
Bo to geany, a ja się przyzwyczaiłem się do automatycznych wcięc np: w netbeans. Tak czy siak rozwiązało to problem.

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.)
+2 głosów
3 odpowiedzi 1,627 wizyt
pytanie zadane 6 stycznia 2016 w C i C++ przez Wilier Bywalec (2,570 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 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!

...