Sprawdzanie stanu procesu potomnego
-
- 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
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?
- el.pescado
- 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
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:
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
-
- 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
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.
- el.pescado
- 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
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.
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.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości