Newsgroup: it.comp.os.linux.development
Titolo: dubbio su processi padre e figlio

Stavo leggendo unix network programming, quando mi sono imbattuto in
if the daemon is started from a shell script without being placed in the
background, the daemon will cause the processing of the shell script to
stop until the daemon finishes. To avoid either of these, the daemon
should do a fork and have the parent exit, allowing the actual daemon to
continue in the child process.
Ma se il padre esce il figlio non viene terminato? Non è come quando uno
lancia un wget dentro una xterm, che se chiudi il terminale muore il wget?


Se il demone è lanciato da uno script di shell senza essere messo in
background, il demona obbligherà lo script a fermarsi (in attesa) finché
il demone non finisce. Per evitare questo comportamente, il demone
dovrebbe forkare e far uscire il padre, permettendo al demone di
continuare nel processo figlio.
script -> lancia il demone -> demone forka in demone1 e demone2 ->
demone1 finisce (così lo script non è "bloccato") -> demone2 continua.
Non era complicato, solo forse un periodo un po' contorto ;-)

 il demone non finisce. Per evitare questo comportamente, il demone
s/comportamente/comportamento/
eh, scrivere di getto... ^_^

 Non era complicato, solo forse un periodo un po' contorto ;-)
ehm, non ho chiesto la traduzione. Ho chiesto perché non muore il figlio
all'uscita del padre. ;-P


dalla mia traduzione si capisce.

Tetsuya wrote:

veramente non l'ho capito neppure io :-)
-- 
SF

 
http://www.lilik.it/~mirko/gapil/gapilsu39.html#x86-540003.2.4
---
 La scelta di riportare al padre lo stato di terminazione dei figli, pur
essendo l'unica possibile, comporta comunque alcune complicazioni:
infatti se alla sua creazione è scontato che ogni nuovo processo ha un
padre, non è detto che sia così alla sua conclusione, *dato che il padre
potrebbe essere già terminato (si potrebbe avere cioè quello che si
chiama un processo orfano).*
Questa complicazione viene superata facendo in modo che il processo
orfano venga adottato da init. Come già accennato quando un processo
termina, il kernel controlla se è il padre di altri processi in
esecuzione: in caso positivo allora il ppid di tutti questi processi
viene sostituito con il pid di init (e cioè con 1); in questo modo ogni
processo avrà sempre un padre (nel caso possiamo parlare di un padre
adottivo) cui riportare il suo stato di terminazione.
---
Invece credo che nell'esempio che è stato riportato (per confronto) di
un xterm che lancia wget, in quel caso non viene usata fork() ma una
funzione della famiglia exec()
http://www.lilik.it/~mirko/gapil/gapilsu42.html#x91-570003.2.7
---
Abbiamo già detto che una delle modalità principali con cui si
utilizzano i processi in Unix è quella di usarli per lanciare nuovi
programmi: questo viene fatto attraverso una delle funzioni della
famiglia exec. Quando un processo chiama una di queste funzioni esso
viene completamente sostituito dal nuovo programma; il pid del processo
non cambia, dato che non viene creato un nuovo processo, la funzione
semplicemente rimpiazza lo stack, lo heap, i dati ed il testo del
processo corrente con un nuovo programma letto da disco.
---

 
http://www.lilik.it/~mirko/gapil/gapilsu42.html#x91-570003.2.7
eccolo qua, questo è il mio dubbio.
Da quello che so io una shell quando prende un comando forka, sul figlio
chiama exec e il padre fa una wait per poi riproporre il prompt. Se non
forkasse non potrebbe proporre il prompt perché l'exec tronca il vecchio
codice e non puoi tornare indietro, a meno di non rilanciare la shell
all'uscita del processo.