🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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ę
#72965
Author: heby
Date: Wed, 26 Aug 2020 11:18
23 lines
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ę
#72966
Author: Bogdan (bogdro)
Date: Mon, 31 Aug 2020 15:42
80 lines
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ę
#72967
Author: heby
Date: Mon, 31 Aug 2020 15:52
16 lines
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