Funkcja fork exec

0

Wywołuję funkcję switch(fork()) (język C) i chcę, aby pobrać PID procesu potomnego i wyświetlić go w procesie macierzystym. W tym celu poza switchem deklaruję zmienną pid_t a, a w case 0 piszę "a=getpid()". W default próbuję wyświetlić numer PID procesu potomnego (używam też wait(0)), jednak pokazują mi się dwie wartości - jedna faktycznie taka, jakie jest PID procesu potomnego, a druga równa 0. Dodatkowo gdy w case 0 po zapisaniu wartości PID wywołuję funkcję exec, wtedy w mojej zmiennej a jest tylko 0, ewentualnie jakieś przypadkowe liczby, Dlaczego tak się dzieje i jak napisać instrukcje w case 0 i default tak, aby program działał?

0

jednak pokazują mi się dwie wartości

o_O
No ale przecież zrobiłeś forka, więc pojawił się drugi proces, który wykonuje się od tego samego miejsca w kodzie. Parent dostaje pid potomka, a potomek dostaje 0. Czego się niby spodziewałeś? Rozumiesz w ogóle co robi fork? Powstają ci tam dwa równoległe procesy, które od tej chwili pracują niezależnie od siebie.

pid = fork();
if (pid == 0){
    // jesteśmy dzieckiem, robimy exec czy co tam chcesz
} else{
    // jesteśmy rodzicem i pid potomka to pid
}
0
Shalom napisał(a):

o_O
No ale przecież zrobiłeś forka, więc pojawił się drugi proces, który wykonuje się od tego samego miejsca w kodzie. Parent dostaje pid potomka, a potomek dostaje 0. Czego się niby spodziewałeś? Rozumiesz w ogóle co robi fork?

Chcę, żeby PID procesu potomnego było wyświetlane w akcji dla procesu macierzystego pryz użyciu funkcji getpid() (takie mam polecenie). Wiem, że pojawił się drugi proces i że parent dostaje PID potomka, a potomek 0, ale muszę użyć funkcji getpid(). Dlatego chciałem zrobić getpid() w procesie potomnym i to PID zapisać do mojej zmiennej, a następnie wyświetlić zawartość zmiennej, ale już w procesie macierzystym.

pid_t l;
switch (fork()){

		case -1:
		perror("Fork error");
		exit(1);

		case 0:
		l=getpid();
		printf("PID potomnego to %d\n",l);

		default:
		printf("PID potomka to %d\n", l);
}

Może na kodzie będzie łatwiej się zrozumieć

0

Nie możesz tak zrobić. getpid() zwraca pid aktualnego procesu i tyle. Parent nie dostanie w ten sposób PIDa potomka, co zresztą dość logiczne, bo co miałby dostać jakbyś zrobił fork kilka razy?
To co teraz robisz to w ogóle UB bo dla parenta zmienna l (świetna nazwa tak btw) jest niezainicjalizowana. Dane między tymi procesami NIE SĄ WSPÓŁDZIELONE. W twoim kodzie parent wykona:

fork();
printf("PID potomka to %d\n", l);

a potomek:

l=getpid();
printf("PID potomnego to %d\n",l);

1 użytkowników online, w tym zalogowanych: 0, gości: 1