Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.os.linux.programowanie > #2223 > unrolled thread

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

Started byheby <heby@poczta.onet.pl>
First post2020-08-26 13:18 +0200
Last post2020-08-31 17:52 +0200
Articles 3 — 2 participants

Back to article view | Back to pl.comp.os.linux.programowanie


Contents

  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

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

Fromheby <heby@poczta.onet.pl>
Date2020-08-26 13:18 +0200
Subjectwaitpid 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]


#2228

From"Bogdan (bogdro)" <bogdan@poczta.gazeta.pl>
Date2020-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]


#2229

Fromheby <heby@poczta.onet.pl>
Date2020-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