Sprawdzanie stanu procesu potomnego

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
robal1024
Piegowaty Guziec
Piegowaty Guziec
Posty: 14
Rejestracja: 04 kwie 2008, 16:45
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME
Kontakt:

Sprawdzanie stanu procesu potomnego

Post autor: robal1024 »

Czy istnieje w cpp metoda sprawdzenia stanu procesu potomnego (czy pracuje, czy też się zakończył)? Mam następujący problem. Piszę program okienkowy, który wywołuje pewien proces potomny i musi zaczekać, aż zakończy on pracę, po czym kontynuuje on działanie. Wiadomo, że działanie programu rodzica można zatrzymać do końca wykonania się procesu potomnego funkcjami waitpid lub wait. Jednak wtedy okienko programu szarzeje, jakby wskazywało zawieszenie systemu. Po zakończeniu procesu potomnego oczywiście wraca do stanu początkowego, jednak dla użytkownika może nie być to takie oczywiste. Skutkiem będzie skillowanie przez niego procesu rodzica, co zaowocuje niekompletną operacją. Gdyby proces potomny wykonywał się szybko, nie stanowiłoby to problemu, jednak w moim wypadku może to trwać nawet kilkadziesiąt minut... Wpadłem na pomysł, aby sprawdzić stan potomka i jeżeli dostanę informację, że pracuje, proces rodzica wywoła funkcję sleep(1). Jeżeli zapętlę te czynności, rodzic powinien spać, do czasu aż potomek skończy pracę. Jednak mam problemy ze znalezieniem koniecznej funkcji zwracającej stan potomka. Jak rozwiązać ten problem? Może w inny sposób niż zasugerowałem?
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Sprawdzanie stanu procesu potomnego

Post autor: el.pescado »

Do sprawdzania, czy proces potomny się zakończył służy funkcja waitpid. Podając funkcji waitpid wartość WNOHANG w parametrze options, sprawia się, że funkcja ta nie czeka na zakończenie procesu.

Dodatkowo, funkcja kill (dosyć nieoczekiwane zachowania;D) z parametrem sig równym zero może być użyta do sprawdzenia czy proces o danym PID istnieje.

Więcej informacji:

Kod: Zaznacz cały

sudo apt-get install manpages-dev
man 2 waitpid
man 2 kill
robal1024
Piegowaty Guziec
Piegowaty Guziec
Posty: 14
Rejestracja: 04 kwie 2008, 16:45
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME
Kontakt:

Odp: Sprawdzanie stanu procesu potomnego

Post autor: robal1024 »

Dałbym głowę, że szedłem tym tropem i z opcją WNOHANG nie chciało działać... Tak czy inaczej dziękuję, jakby dalej nie działało, to wkleję cały kod.
Awatar użytkownika
el.pescado
Zakręcona Traszka
Zakręcona Traszka
Posty: 734
Rejestracja: 26 maja 2005, 11:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: Sprawdzanie stanu procesu potomnego

Post autor: el.pescado »

P.S. Jeśli będziesz wykonywał sleep(), okno programu też ni będzie się odrysowywało. Rozwiązania są dwa: albo skorzystasz z timera, uruchamiającego co pewien czas funkcję sprawdzającą stan dziecka, po czym oddającego kontrolę do głównej pętli programu, pozwalając na odrysowywanie głównego interfejsu użytkownika, albo utworzysz nowy wątek, który będzie czekał na dziecko funkcją waitpid, przez co główny wątek będzie mógł się zająć odrysowywaniem okna.

Pierwsze wyjście wydaje mi się lepsze. Konkretna implementacja zależy od biblioteki graficznej, którą używasz. w GTK+ można się posłużyć funkcją g_timeout_add.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości