Thread View: pl.comp.os.linux.programowanie
3 messages
3 total messages
Started by heby
Wed, 26 Aug 2020 11:18
waitpid i proces zakończony - nie dziala jak oczekuję
Author: heby
Date: Wed, 26 Aug 2020 11:18
Date: Wed, 26 Aug 2020 11:18
23 lines
2033 bytes
2033 bytes
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().
Re: waitpid i proces zakończony - nie dziala jak oczekuję
Author: Bogdan (bogdro)
Date: Mon, 31 Aug 2020 15:42
Date: Mon, 31 Aug 2020 15:42
80 lines
3182 bytes
3182 bytes
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
Re: waitpid i proces zakończony - nie dziala jak oczekuję
Author: heby
Date: Mon, 31 Aug 2020 15:52
Date: Mon, 31 Aug 2020 15:52
16 lines
1958 bytes
1958 bytes
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
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads