Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > pl.comp.os.linux.programowanie > #2223 > unrolled thread
| Started by | heby <heby@poczta.onet.pl> |
|---|---|
| First post | 2020-08-26 13:18 +0200 |
| Last post | 2020-08-31 17:52 +0200 |
| Articles | 3 — 2 participants |
Back to article view | Back to pl.comp.os.linux.programowanie
waitpid i proces zakończony - nie dziala jak oczekuję heby <heby@poczta.onet.pl> - 2020-08-26 13:18 +0200
Re: waitpid i proces zakończony - nie dziala jak oczekuję "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> - 2020-08-31 17:42 +0200
Re: waitpid i proces zakończony - nie dziala jak oczekuję heby <heby@poczta.onet.pl> - 2020-08-31 17:52 +0200
| From | heby <heby@poczta.onet.pl> |
|---|---|
| Date | 2020-08-26 13:18 +0200 |
| Subject | waitpid i proces zakończony - nie dziala jak oczekuję |
| Message-ID | <ri5gf5$s71$1@dont-email.me> |
Cześć. Przyłapałem moją aplikację na takiej sytuacji: Proces A: zawieszony w funkcji waitpid( numer ) Proces B o numerze "numer": <defunct> Niepokoi mnie że waitpid służy do oczekiwania na *zmianę* statusu procesu potomnego. A ja chce czekać aż proces wyjdzie. nawet jeśli to czekanie rozpoczynam jak już wyszedł. Zaznaczam że gdyby to była prawda (waitpid nie może czekać na zakończony proces), to nie widzę rozwiązania bez race condition. Czy mam rację podejrzewając że waitpid moze nie zauwazyć procesu który jest martwy w momencie wołania? Jak to się poprawnie rozwiązuje? PS. Dokumentacja mówi jednak że "jesli proces już zmienił stan to natychmiast wyjdzie" Hmm... no więc czeka nie wiem na co a proces jest po exicie. PS2. Drugi proces powstał w wyniku forka, ale nie dał rady odpalić execv i wyszedł natychmiast za pomoca exit().
[toc] | [next] | [standalone]
| From | "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> |
|---|---|
| Date | 2020-08-31 17:42 +0200 |
| Message-ID | <rij5pc$4o3$1@gioia.aioe.org> |
| In reply to | #2223 |
W dniu 26.08.2020 o 13:18, heby pisze:
> Cześć.
>
> Przyłapałem moją aplikację na takiej sytuacji:
>
> Proces A: zawieszony w funkcji waitpid( numer )
>
> Proces B o numerze "numer": <defunct>
>
> Niepokoi mnie że waitpid służy do oczekiwania na *zmianę* statusu
> procesu potomnego. A ja chce czekać aż proces wyjdzie. nawet jeśli to
> czekanie rozpoczynam jak już wyszedł.
>
> Zaznaczam że gdyby to była prawda (waitpid nie może czekać na
> zakończony proces), to nie widzę rozwiązania bez race condition. Czy
> mam rację podejrzewając że waitpid moze nie zauwazyć procesu który
> jest martwy w momencie wołania? Jak to się poprawnie rozwiązuje?
>
> PS. Dokumentacja mówi jednak że "jesli proces już zmienił stan to
> natychmiast wyjdzie" Hmm... no więc czeka nie wiem na co a proces jest
> po exicie.
>
> PS2. Drugi proces powstał w wyniku forka, ale nie dał rady odpalić
> execv i wyszedł natychmiast za pomoca exit().
Cześć.
Z ciekawości podjąłem temat, bo używam waitpid().
Czy masz jakiś mały fragment kodu, który pokazuje problem? Spróbuj z
flagą WUNTRACED. Bo "u mnie działa" (na szczęście), nawet bez flag
(jądro 5.5.12, glibc 2.29). Proces wchodzi w zombie ("defunct") na
czas sleep(), ale waitpid() nie wisi.
bogdan 3376 1795 0 17:35 pts/1 00:00:00 ./exectest
bogdan 3377 3376 0 17:35 pts/1 00:00:00 [exectest] <defunct>
------------------------
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
pid_t p;
int main(void)
{
pid_t res_pid;
int child_status;
p = fork();
if ( p < 0 ) return 2;
if ( p == 0 )
{
/* potomek */
printf("Potomek\n");
exit(1);
}
else
{
/* rodzic */
printf("Rodzic\n");
sleep(5);
res_pid = waitpid (p, &child_status, 0);
printf("Rodzic 2\n");
}
return 0;
}
------------------------
--
Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux): http://bogdro.evai.pl
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.Xiph.org www.TorProject.org Soft(EN): http://bogdro.evai.pl/soft
[toc] | [prev] | [next] | [standalone]
| From | heby <heby@poczta.onet.pl> |
|---|---|
| Date | 2020-08-31 17:52 +0200 |
| Message-ID | <rij6b6$qhl$1@dont-email.me> |
| In reply to | #2228 |
On 31/08/2020 17:42, Bogdan (bogdro) wrote: > Z ciekawości podjąłem temat, bo używam waitpid(). > Czy masz jakiś mały fragment kodu, który pokazuje problem? Nie. To duża aplikacja, intensywnie obciązająca cpu duża ilością wątków, cięcie je na mniejsze kawałki powoduje że problem nie istnieje, podobnie sam problem występuje raz na setki tysięcy odpaleń. Najzwyczajniej pewnego dnia zalogowałem się na maszynę gdzie zastałem taką sytuację. Trafiło się to 2-gi raz, na innej maszynie i zastanawia mnie czy to nie jest jakiś niezwykle mało prawdopodoby race condition w systemie, czy też może jakiś glitch związany z awarią sprzętową. Wole zapytać czy ktoś nie słyszał o jakimś problemie, np. z jądrem. > int main(void) Takie rzeczy działają zawsze dobrze :P
[toc] | [prev] | [standalone]
Back to top | Article view | pl.comp.os.linux.programowanie
csiph-web