Wysyłanie sygnału z procesu macierzystego do procesu potomnego

0

Mam napisany program do obsługi sygnałów z możliwościami wykonania operacji domyślnej, zignorowania lub przechwycenia sygnału. Teraz chciałem napisać program, w którym w procesie potomnym za pomocą funkcji exec będzie uruchamiany powyższy program, a proces macierzysty ma wysyłać sygnały do uruchomionego procesu. Wykorzystuję do tego switcha. Na początku zrobiłem to w ten sposób, że dałem zmienną pid_t f=fork() i następnie wywoływałem funkcję switch (f). Wtedy w akcji dla procesu macierzystego (default) moja funkcja kill wyglądała tak: kill(f,wysylany_sygnal). Z tego co rozumiem, sygnał był wysyłany do procesu potomnego, ponieważ pod zmienną f w procesie macierzystym będę mieć PID procesu potomnego. I tutaj wszystko działało. Jednak chciałem zrobić to samo przy użyciu funkcji getpid(). W tym celu w case 0 (akcji dla procesu potomnego) pobieram za pomocą fukcji getpid() PID procesu potomnego i umieszczam go w mojej zmiennej, powiedzmy g. Jednak teraz nie wiem, jak użyć funkcji kill w procesie macierzystym, konkretniej jakie PID wpisać, ponieważ gdy przechodzę do procesu macierzystego w zmiennej g przechowywane są jakieś dziwne liczby, a po uruchomieniu funkcji exec w procesie potomnym dodatkowo są one ujemne. Dlaczego tak się dzieje i jak to naprawić?

W drugim przypadku nie mam zmiennej f, wywołanie wygląda następująco: switch(fork())

0

W tym celu w case 0 (akcji dla procesu potomnego) pobieram za pomocą fukcji getpid() PID procesu potomnego i umieszczam go w mojej zmiennej, powiedzmy g. Jednak teraz nie wiem, jak użyć funkcji kill w procesie macierzystym, konkretniej jakie PID wpisać, ponieważ gdy przechodzę do procesu macierzystego w zmiennej g przechowywane są jakieś dziwne liczby, a po uruchomieniu funkcji exec w procesie potomnym dodatkowo są one ujemne. Dlaczego tak się dzieje i jak to naprawić?

Nie da się tak zrobić o_O To są teraz DWA OSOBNE PROCESY i NIE WSPÓŁDZIELĄ danych! Zrobiłeś getpid w procesie potomka i w JEGO lokalnej zmiennej zapisałeś tenże pid. Parent NIC o tym nie wie i wiedzieć nie może, chyba ze miałbyś tam jakąś pamięć współdzieloną.
Jeśli chcesz znać PID potomka w procesie parenta to musisz go sobie zapisać jako wartość zwracaną z fork.

jakieś dziwne liczby

No masz niezainicjalizowaną zmienną, toteż trzyma jakieś losowe wartości.

jak to naprawić

Zacznij od przeczytania co robi fork.

0
Shalom napisał(a):

Nie da się tak zrobić o_O To są teraz DWA OSOBNE PROCESY i NIE WSPÓŁDZIELĄ danych! Zrobiłeś getpid w procesie potomka i w JEGO lokalnej zmiennej zapisałeś tenże pid. Parent NIC o tym nie wie i wiedzieć nie może, chyba ze miałbyś tam jakąś pamięć współdzieloną.
Jeśli chcesz znać PID potomka w procesie parenta to musisz go sobie zapisać jako wartość zwracaną z fork.

Nawet, jeżeli jest to zmienna zadeklarowana przed zainicjowaniem forka, na samym początku programu? Wtedy nie jest to chyba zmienna lokalna tylko dla potomka.

Zacznij od przeczytania co robi fork.

Wiem, co robi fork :/

2

Wiem, co robi fork

Nope.
Zmienne zadeklarowane przed fork będą skopiowane i każdy z procesów będzie miał swoją kopię takiej zmiennej.

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