Tworzenie drzewa procesów (Ubuntu)


(rafalski_4) #1

Jestem w trakcie nauki lnuxa i zatrzymałem się na programowaniu procesów w C. Dla formalności, system na jakim pracuje to Ubuntu 17.10.

Chciałbym stworzyć takie drzewo procesów:
http://i.prntscr.com/HBs24fGZTtm3V1kVsgxGcw.png

Napisałem kod, który wg mnie jest poprawny. Wygląda on następująco:

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

int main() {

printf(“Proces1 PID: %6d PPID: %6d \n”, getpid(), getppid());

if(fork()==0) {
printf("Proces2 PID: %6d PPID: %6d \n", getpid(), getppid());
exit(0);
}

if(fork()==0) {
printf("Proces3 PID: %6d PPID: %6d \n", getpid(), getppid());

	if(fork()==0) {
	printf("Proces6 PID: %6d PPID: %6d \n", getpid(), getppid());
	exit(0);
	}
	if(fork()==0) {
	printf("Proces7 PID: %6d PPID: %6d \n", getpid(), getppid());
		if(fork()==0) {
		printf("Proces10 PID: %6d PPID: %6d \n", getpid(), getppid());
		exit(0);
		}	
	exit(0);
	}
exit(0);
}

	if(fork()==0) {
	printf("Proces4 PID: %6d PPID: %6d \n", getpid(), getppid());
	exit(0);
	}

	if(fork()==0) {
	printf("Proces5 PID: %6d PPID: %6d \n", getpid(), getppid());

		if(fork()==0) {
		printf("Proces8 PID: %6d PPID: %6d \n", getpid(), getppid());
		exit(0);
		}
		if(fork()==0) {
		printf("Proces9 PID: %6d PPID: %6d \n", getpid(), getppid());
		exit(0);
		}
	exit(0);
	}

}

Po wykonaniu funkcji gcc i uruchomieniu w terminalu uzyskuję takie okno:

Jak widać PPID procesu 5 jest złe, bo powinno być 4464
Procesy 6 i 7 również mają złe PPID
Reszta jest ok. Czy mógłbym prosić o pomoc w rozwiązaniu mojego problemu?
Z góry dziękuję i pozdrawiam
Rafał


(Razi) #2

PIDy mogą być względnie losowe. Nie kieruj się tym. Od 1 do 5 mają po kolei. Kolejność wyjść też jest względnie losowa. W tym cały urok współbieżności – nieprzewidywalność zachowania kolejności poszczególnych zadań.