Funkcja fork exec

Funkcja fork exec
H5
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:66
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ł?

edytowany 1x, ostatnio: hidden55
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.

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

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 6x, ostatnio: Shalom
H5
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:66
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.

Kopiuj
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ć

Delor
Tak bez break'a czy tam return'a?
H5
A w którym miejscu je dopisać i jak pomogą w moim problemie?
Delor
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 2 lata
0
edytowany 1x, ostatnio: Delor
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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:

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

a potomek:

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

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.