Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

waitpid i proces zakończony - nie dziala jak oczekuję

2 views
Skip to first unread message

heby

unread,
Aug 26, 2020, 7:19:03 AM8/26/20
to
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().

Bogdan (bogdro)

unread,
Aug 31, 2020, 11:42:40 AM8/31/20
to
W dniu 26.08.2020 o 13:18, heby pisze:
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

heby

unread,
Aug 31, 2020, 11:52:08 AM8/31/20
to
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
0 new messages