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ł?

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
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
}
- Rejestracja:ponad 6 lat
- Ostatnio:ponad 3 lata
- Postów:66
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 robifork
?
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ć

- Rejestracja:ponad 6 lat
- Ostatnio:około 2 lata
Opis instrukcji switch
: https://en.cppreference.com/w/c/language/switch

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
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);
break
'a czy tamreturn
'a?