Pagina 1 di 1
[C] Lanciare processo figlio con riga di comando
Inviato: sabato 16 giugno 2007, 19:50
da menelicte
E' possibile fare in modo che il padre conosca il pid del figlio, anche se quest'ultimo si distacca subito dopo?
Per chiarezza sto cercando di fare questo:
http://forum.ubuntu-it.org/viewtopic.ph ... #msg589862
Se c'è qualcuno in grado di darmi una mano gliene sarei molto grato (b2b)
ciao
Re: [C] Lanciare processo figlio con riga di comando
Inviato: sabato 16 giugno 2007, 21:05
da Giambo
menelicte ha scritto:
E' possibile fare in modo che il padre conosca il pid del figlio, anche se quest'ultimo si distacca subito dopo?
Se la memoria non mi inganna, fork() ritorna il PID del nuovo processo ...
Re: [C] Lanciare processo figlio con riga di comando
Inviato: sabato 16 giugno 2007, 21:14
da kaosktrl
Ciao,
come dice menelicte se usi la fork() questa ritorna al padre il PID del figlio mentre al figlio il valore 0.
Vedi esempio:
http://it.wikipedia.org/wiki/Fork_%28programmazione%29
Re: [C] Lanciare processo figlio con riga di comando
Inviato: sabato 16 giugno 2007, 21:33
da menelicte
si, ma il problema è che dopo la fork(), il figlio invoca la execv(), con la quale si stacca dal padre e si rigenera con un ulteriore pid.
Per esempio: il padre riceve dalla fork() il pid 13507, mentre il nuovo processo ha il pid 13509.
padre
|
fork()
/ \
padre figlio - - - execv() - - -> nuovo processo indipendente
Re: [C] Lanciare processo figlio con riga di comando
Inviato: sabato 16 giugno 2007, 21:51
da TonT
no ... quando tu chiama exec* l immagine del processo resta uguale..viene sostituito soltanto il codice...
Re: [C] Lanciare processo figlio con riga di comando
Inviato: sabato 16 giugno 2007, 22:06
da menelicte
dovrebbe, ma non lo fa...
se gli dò:
Codice: Seleziona tutto
execl("/usr/bin/gnome-terminal","/usr/bin/gnome-terminal",0);
al padre dice che il pid è 16794, ma poi il pid del terminal aperto è 16797
probabilmente è gnome-terminal che si avvia così, cambiando pid,
volevo capire se è possibile prevedere quest'avvio e ricavare il pid nuovo
Re: [C] Lanciare processo figlio con riga di comando
Inviato: domenica 17 giugno 2007, 0:45
da SuperAxel
la fork restituisce sempre il pid del figlio al padre, quindi non puoi sbagliarti,anche se chiami una funzione della famiglia exec. se vuoi approfondire la programmazione di sistema scarica GAPIL, una veloce ricerca su google e lo trovi, è un manuale che ti spiega la programmazione con le system call e altre cosette....l'ho usato per l'esame di laboratorio di sistemi operativi.
Re: [C] Lanciare processo figlio con riga di comando
Inviato: domenica 17 giugno 2007, 0:57
da menelicte
premesso che so come funzionano la fork e la exec* (sto consultando delle dispense di laboratorio di sistemi operativi),
quello che dico è che la pratica non rispetta le aspettative >:(
il processo figlio si chiude subito, generando un processo clone con un altro pid e il cui processo padre è init
spero di essermi spiegato e spero che qualcuno sappia spiegarmelo ???
Re: [C] Lanciare processo figlio con riga di comando
Inviato: domenica 17 giugno 2007, 1:03
da menelicte
comunque grazie per la dritta su GAPIL :P
Re: [C] Lanciare processo figlio con riga di comando
Inviato: domenica 17 giugno 2007, 1:18
da Lord_Dex
c'e' un metodo per far avere al padre il pid del figlio, crei una pipe prima del fork, e successivamente dopo essersi distaccato il figlio consegna tramite la pipe al padre il suo nuovo pid.
Bye
P.S.
ti conviene creare anche prima del fork una variabile che contiene il pid del padre, perche' senza far restare in attesa il padre per la lettura, dal figlio "staccato" mandi un sig ed il padre si predispone in lettura dalla pipe.
Spero di essere stato chiaro.
Re: [C] Lanciare processo figlio con riga di comando
Inviato: domenica 17 giugno 2007, 11:17
da Giambo
menelicte ha scritto:
il processo figlio si chiude subito, generando un processo clone con un altro pid e il cui processo padre è init
spero di essermi spiegato e spero che qualcuno sappia spiegarmelo ???
Probabilmente e' un comportamento "voluto" di gnome-terminal. Succede anche con altri processi ?
Se la mia memoria non mi inganna (Di nuovo

), i figli ai quali muore il padre vengono adottati da init.
Re: [C] Lanciare processo figlio con riga di comando
Inviato: domenica 17 giugno 2007, 11:23
da Lord_Dex
Giambo ha scritto:
menelicte ha scritto:
il processo figlio si chiude subito, generando un processo clone con un altro pid e il cui processo padre è init
spero di essermi spiegato e spero che qualcuno sappia spiegarmelo ???
Probabilmente e' un comportamento "voluto" di gnome-terminal. Succede anche con altri processi ?
Se la mia memoria non mi inganna (Di nuovo

), i figli ai quali muore il padre vengono adottati da init.
Si è il comportamento normale di tutti i processi in unix!
Re: [C] Lanciare processo figlio con riga di comando
Inviato: domenica 17 giugno 2007, 13:36
da menelicte
ho provato a farmi stampare dal figlio il suo pid, ma corrisponde a quello restituito dalla fork... >:(
quello che penso è che al lancio di alcuni programmi (tipo gnome-terminal) venga avviato un processo che genera subito un figlio e poi termina.
il figlio viene ereditato da init e non è possibile comoscerne il pid da parte del processo che ha invocato l'applicazione
1) il padre da' la fork()
2) il figlio dà la exec*()
3) dopo la exec il figlio genera un "nipote"
4) il figlio muore e il "nipote" viene ereditato da init
il punto 3 e 4 non sono prevedibili (dipendono dal programma lanciato)
se è così... c'è un modo per evitarlo? (con ulteriori istruzioni C o con riga di comando più complessa del semplice "gnome-terminal")
ciao
Re: [C] Lanciare processo figlio con riga di comando
Inviato: domenica 17 giugno 2007, 18:19
da Giambo
menelicte ha scritto:
1) il padre da' la fork()
2) il figlio dà la exec*()
3) dopo la exec il figlio genera un "nipote"
4) il figlio muore e il "nipote" viene ereditato da init
il punto 3 e 4 non sono prevedibili (dipendono dal programma lanciato)
Forse e' stato pensato cosi' per evitare che alla morte del padre, pure la shell muoia portandosi dietro altri figli da lei generata.
Sono solo supposizioni, con Goolge non ho trovato nulla a proposito ...
Re: [C] Lanciare processo figlio con riga di comando
Inviato: lunedì 18 giugno 2007, 12:42
da SuperAxel
prova lanciando un altro comando e vedi il suo comportamento, così capisci se è un comportamento normale di gnome terminal.
Re: [C] Lanciare processo figlio con riga di comando
Inviato: lunedì 18 giugno 2007, 15:45
da menelicte
SuperAxel ha scritto:
prova lanciando un altro comando e vedi il suo comportamento, così capisci se è un comportamento normale di gnome terminal.
ok, credo che sia un comportamento normale di gnome-terminal, come di firefox e di nautilus (e a questo punto ritengo della maggior parte delle applicazioni)... solo inkscape sembra usare lo stesso processo figlio.
del resto anche dando da terminale il comando
gnome-terminal&:
Codice: Seleziona tutto
menelicte@niente-laptop:~$ gnome-terminal&
[1] 5654
menelicte@niente-laptop:~$
il pid nuovo risulta 5657...