Strona 1 z 1

Sprawdzanie stanu procesu potomnego

: 28 wrz 2008, 03:07
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?

Odp: Sprawdzanie stanu procesu potomnego

: 28 wrz 2008, 13:20
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

Odp: Sprawdzanie stanu procesu potomnego

: 28 wrz 2008, 13:26
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.

Odp: Sprawdzanie stanu procesu potomnego

: 28 wrz 2008, 13:30
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.