🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #72966

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

#72966
From: 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
Technical Details
Message-ID: <rij5pc$4o3$1@gioia.aioe.org>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder8.news.weretis.net!news.mixmin.net!aioe.org!.POSTED.5iCVG8bNd3ZPhJI6CQ6lxQ.user.gioia.aioe.org!not-for-mail
References: <ri5gf5$s71$1@dont-email.me>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder8.news.weretis.net!news.mixmin.net!aioe.org!.POSTED.5iCVG8bNd3ZPhJI6CQ6lxQ.user.gioia.aioe.org!not-for-mail
From: "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl>
Newsgroups: pl.comp.os.linux.programowanie
Subject: Re: waitpid i proces zakończony - nie dziala jak
 oczekuję
Date: Mon, 31 Aug 2020 17:42:36 +0200
Organization: Aioe.org NNTP Server
Lines: 80
Message-ID: <rij5pc$4o3$1@gioia.aioe.org>
References: <ri5gf5$s71$1@dont-email.me>
NNTP-Posting-Host: 5iCVG8bNd3ZPhJI6CQ6lxQ.user.gioia.aioe.org
Mime-Version: 1.0
X-Complaints-To: abuse@aioe.org
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0
X-Notice: Filtered by postfilter v. 0.9.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit