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

execl() e zombie (crosspost)

8 views
Skip to first unread message

not1xor1

unread,
Dec 21, 2013, 4:49:08 AM12/21/13
to

è normale che dopo execl() in un fork() ksysguard si riempie di
zombie? cosa c'è di sbagliato?

codice di test:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int run(void) {
if (!fork()) {
puts("questo è il processo figlio");
execl("/bin/sleep", "sleep", "6", NULL);
puts("execl() non ha funzionato");
_exit (EXIT_FAILURE);
}
}

int main(int argc, char **argv) {
int i;
puts("questo è il processo padre");
for (i = 0; i < 10; ++i) {
run();
sleep(2);
}
puts("dopo l\'ultima chiamata di execl() aspetto 10 secondi");
sleep(10);
return 0;
}

--
bye
!(!1|1)


Marco

unread,
Dec 21, 2013, 5:20:05 AM12/21/13
to

man 2 wait

On Sat, 21 Dec 2013 10:49:08 +0100, not1xor1 <" "@libero.it>
wrote:
Cio' che si vede, e'.

Piergiorgio Sartor

unread,
Dec 21, 2013, 6:20:52 AM12/21/13
to
On 2013-12-21 10:49, not1xor1 wrote:
>
> � normale che dopo execl() in un fork() ksysguard si riempie di zombie?
> cosa c'� di sbagliato?

I processi zombie sono quei processi morti
il cui processo padre non ha ancora recepito
(e credo confermato) che sono morti.

Come scrive Marco, "wait" dovrebbe fare al
caso tuo.

bye,

--

piergiorgio

not1xor1

unread,
Dec 21, 2013, 6:33:29 AM12/21/13
to
Il 21/12/2013 11:20, Marco ha scritto:
> man 2 wait

grazie
mi ero fatto fuorviare dal fatto che non volevo bloccare il processo
parent in attesa del child, ma tutto sommato questo non dovrebbe
creare problemi...

--
bye
!(!1|1)

Piergiorgio Sartor

unread,
Dec 21, 2013, 7:24:45 AM12/21/13
to
On 2013-12-21 12:33, not1xor1 wrote:
[...]
> mi ero fatto fuorviare dal fatto che non volevo bloccare il processo
> parent in attesa del child, ma tutto sommato questo non dovrebbe creare
> problemi...

Credo sia possibile, ma non so come, far
ereditare i processi figli ad "init".

Devi dare un'occhiata a qualche sorgente
di qualche demone.

bye,

--

piergiorgio

enoquick

unread,
Dec 21, 2013, 8:37:03 AM12/21/13
to
Il 21/12/2013 06:24, Piergiorgio Sartor ha scritto:
> On 2013-12-21 12:33, not1xor1 wrote:
> [...]
>> mi ero fatto fuorviare dal fatto che non volevo bloccare il processo
>> parent in attesa del child, ma tutto sommato questo non dovrebbe creare
>> problemi...
>
> Credo sia possibile, ma non so come, far
> ereditare i processi figli ad "init".
>

Basta che il padre muoia prima dei figli, è ' unico modo

Giovanni

unread,
Dec 21, 2013, 8:43:19 AM12/21/13
to
On 12/21/2013 12:33 PM, not1xor1 wrote:

>> man 2 wait
>
> grazie mi ero fatto fuorviare dal fatto che non volevo bloccare il
> processo parent in attesa del child, ma tutto sommato questo non
> dovrebbe creare problemi...

$ man 3 daemon

Il processo padre diventa uno zombie perchᅵ i figli ereditano i
descrittori standard di I/O ed impediscono al padre di liberare le
risorse.

La funzione daemon() non ᅵ direttamente applicabile all'esempio ma
dovrebbe essere facilmente emulabile.

Ciao
Giovanni
--
A computer is like an air conditioner,
it stops working when you open Windows.
< http://giovanni.homelinux.net/ >

enoquick

unread,
Dec 21, 2013, 8:47:34 AM12/21/13
to
il motivo è semplice, il padre deve recepire la morte del figlio
Se non lo fa il kernel mette il processo defunto in stato zombi in
attesa che il processo padre prima o poi lo faccia
Esistono due modi, uno sincrono e l' altro asincrono
In modalità sincrona basta una chiamata ad una syscall della famiglia
wait,in modalità asincrona occorre impostare un handler sul segnale SIGCHLD
Quando un figlio muore l' handler viene eseguito ed il padre può fare la
wait



Manlio Perillo

unread,
Dec 21, 2013, 9:04:18 AM12/21/13
to
Non serve bloccare, puoi chiamare wait in un signal handler, vedi SIGCHLD.


Ciao Manlio

enoquick

unread,
Dec 21, 2013, 9:11:13 AM12/21/13
to
Il 21/12/2013 07:43, Giovanni ha scritto:
> On 12/21/2013 12:33 PM, not1xor1 wrote:
>
>>> man 2 wait
>>
>> grazie mi ero fatto fuorviare dal fatto che non volevo bloccare il
>> processo parent in attesa del child, ma tutto sommato questo non
>> dovrebbe creare problemi...
>
> $ man 3 daemon
>
> Il processo padre diventa uno zombie perché i figli ereditano i
> descrittori standard di I/O ed impediscono al padre di liberare le risorse.
>

Veramente si parlava dei figli che diventano zombi
Ed uno zombi è sempre figlio di qualcuno
I descrittori di I/O con gli zombi non hanno niente a che fare



> La funzione daemon() non è direttamente applicabile all'esempio ma

Manlio Perillo

unread,
Dec 21, 2013, 9:43:35 AM12/21/13
to
Il Sat, 21 Dec 2013 07:47:34 -0600, enoquick ha scritto:

> Il 21/12/2013 03:49, not1xor1 ha scritto:
>>
>> è normale che dopo execl() in un fork() ksysguard si riempie di zombie?
>> cosa c'è di sbagliato?
>>
> [...]
>
> il motivo è semplice, il padre deve recepire la morte del figlio Se non
> lo fa il kernel mette il processo defunto in stato zombi in attesa che
> il processo padre prima o poi lo faccia Esistono due modi, uno sincrono
> e l' altro asincrono In modalità sincrona basta una chiamata ad una
> syscall della famiglia wait,in modalità asincrona occorre impostare un
> handler sul segnale SIGCHLD Quando un figlio muore l' handler viene
> eseguito ed il padre può fare la wait

Leggendo la pagina di wikipedia, esiste un altro modo in POSIX.1-2001:
dire al kernel di fare il reap del processo figlio in modo automatico.
http://en.wikipedia.org/wiki/Child_process


Ciao Manlio

enoquick

unread,
Dec 21, 2013, 2:01:40 PM12/21/13
to
Si, se non si è interessati all' exit code del figlio va bene


> Ciao Manlio
>

not1xor1

unread,
Dec 21, 2013, 12:23:57 PM12/21/13
to
Il 21/12/2013 13:24, Piergiorgio Sartor ha scritto:

>> mi ero fatto fuorviare dal fatto che non volevo bloccare il processo
>> parent in attesa del child, ma tutto sommato questo non dovrebbe creare
>> problemi...
>
> Credo sia possibile, ma non so come, far
> ereditare i processi figli ad "init".

se non ho frainteso il man waitpid() o waitid() con WNOHANG o WNOWAIT
come parametro non bloccano il processo parent, solo che forse poi
bisognerebbe richiamarle fino a che il child non ha terminato...

comunque ho visto che il processo che avviavo (una notifica con
kdialog --nopopup) ritorna subito (poi proverò ad interfacciarmi
direttamente con dbus o con libnotify)

--
bye
!(!1|1)

not1xor1

unread,
Dec 21, 2013, 12:30:30 PM12/21/13
to
Il 21/12/2013 15:04, Manlio Perillo ha scritto:
> Non serve bloccare, puoi chiamare wait in un signal handler, vedi SIGCHLD.

grazie... farò una ricerca con google...
--
bye
!(!1|1)

not1xor1

unread,
Dec 21, 2013, 12:57:46 PM12/21/13
to
Il 21/12/2013 15:43, Manlio Perillo ha scritto:

> Leggendo la pagina di wikipedia, esiste un altro modo in POSIX.1-2001:
> dire al kernel di fare il reap del processo figlio in modo automatico.
> http://en.wikipedia.org/wiki/Child_process

grazie... proverò anche quello...

--
bye
!(!1|1)

not1xor1

unread,
Dec 21, 2013, 12:52:31 PM12/21/13
to
Il 21/12/2013 14:47, enoquick ha scritto:

> il motivo è semplice, il padre deve recepire la morte del figlio
> Se non lo fa il kernel mette il processo defunto in stato zombi in
> attesa che il processo padre prima o poi lo faccia
> Esistono due modi, uno sincrono e l' altro asincrono
> In modalità sincrona basta una chiamata ad una syscall della famiglia
> wait,in modalità asincrona occorre impostare un handler sul segnale
> SIGCHLD
> Quando un figlio muore l' handler viene eseguito ed il padre può fare
> la wait

ok, grazie

--
bye
!(!1|1)

0 new messages