• 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)

+3 głosów
600 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 859 wizyt
pytanie zadane 1 grudnia 2016 w C i C++ przez bart1996 Początkujący (360 p.)
0 głosów
1 odpowiedź 1,361 wizyt
pytanie zadane 11 stycznia 2019 w C i C++ przez poldeeek Mądrala (5,980 p.)
+2 głosów
3 odpowiedzi 2,039 wizyt
pytanie zadane 6 stycznia 2016 w C i C++ przez Wilier Bywalec (2,570 p.)

93,753 zapytań

142,713 odpowiedzi

323,356 komentarzy

63,348 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...