[C] Lanciare processo figlio con riga di comando

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

[C] Lanciare processo figlio con riga di comando

Messaggio 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
"Tentare è il primo passo verso il fallimento" Homer J.
Avatar utente
Giambo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: sabato 4 febbraio 2006, 18:36
Località: Helvetia

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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 ...
Ultima modifica di Giambo il sabato 16 giugno 2007, 21:07, modificato 1 volta in totale.
Here we are again, now place your bets
Avatar utente
kaosktrl
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 393
Iscrizione: giovedì 28 dicembre 2006, 17:01
Contatti:

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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
Ultima modifica di menelicte il sabato 16 giugno 2007, 21:38, modificato 1 volta in totale.
"Tentare è il primo passo verso il fallimento" Homer J.
Avatar utente
TonT
Prode Principiante
Messaggi: 156
Iscrizione: venerdì 1 settembre 2006, 19:39
Località: là sui monti con annette

Re: [C] Lanciare processo figlio con riga di comando

Messaggio da TonT »

no ... quando tu chiama exec* l immagine del processo resta uguale..viene sostituito soltanto il codice...
...Ma io, senza legge, rubai in nome mio,
quegli altri, nel nome di dio...
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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
"Tentare è il primo passo verso il fallimento" Homer J.
SuperAxel
Prode Principiante
Messaggi: 113
Iscrizione: mercoledì 8 marzo 2006, 17:25
Località: Minturno

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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.
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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  ???
"Tentare è il primo passo verso il fallimento" Homer J.
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Lanciare processo figlio con riga di comando

Messaggio da menelicte »

comunque grazie per la dritta su GAPIL  :P
"Tentare è il primo passo verso il fallimento" Homer J.
Avatar utente
Lord_Dex
Prode Principiante
Messaggi: 235
Iscrizione: venerdì 11 maggio 2007, 12:59
Località: Bologna
Contatti:

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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.
-- Lord_Dex --
Linux Registered User: 385122
http://wiki.ubuntu-it.org/FrancescoApollonio/
Avatar utente
Giambo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: sabato 4 febbraio 2006, 18:36
Località: Helvetia

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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.
Here we are again, now place your bets
Avatar utente
Lord_Dex
Prode Principiante
Messaggi: 235
Iscrizione: venerdì 11 maggio 2007, 12:59
Località: Bologna
Contatti:

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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!
-- Lord_Dex --
Linux Registered User: 385122
http://wiki.ubuntu-it.org/FrancescoApollonio/
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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
"Tentare è il primo passo verso il fallimento" Homer J.
Avatar utente
Giambo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1013
Iscrizione: sabato 4 febbraio 2006, 18:36
Località: Helvetia

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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 ...
Here we are again, now place your bets
SuperAxel
Prode Principiante
Messaggi: 113
Iscrizione: mercoledì 8 marzo 2006, 17:25
Località: Minturno

Re: [C] Lanciare processo figlio con riga di comando

Messaggio da SuperAxel »

prova lanciando un altro comando e vedi il suo comportamento, così capisci se è un comportamento normale di gnome terminal.
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: [C] Lanciare processo figlio con riga di comando

Messaggio 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...
"Tentare è il primo passo verso il fallimento" Homer J.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti