Newsgroup: it.comp.os.linux.development
Titolo: come ottenere il PID di un processo

Ciao a tutti
Sapreste aiutarmi
Vorrei reperire il pid number di un processo lanciato attraverso la funzione 
Execl() oppure System()
Possibilmente senza usare metodi complicati ad esempio la fork()!
Ho provato a lanciare il processo in backgroud sperando di poter catturare 
il pid verificando lo STDOUT , ad esempio rv = system("ls / |more & > 
logpid") ma non funziona!!!
Cosa posso fare?
Per favore rispondetemi
Grazie
Donato 

 Per favore rispondetemi
Non so se ho capito bene, ma ci sono le funzioni
setuid, getuid, geteuid ecc...in unistd.h se non erro.
Dovrebbero reperire i valori sulla base dell'handle del processo

 ha scritto nel messaggio 
news:d57cst$e7i$2...@newsreader.mailgate.org...


 Possibilmente senza usare metodi complicati ad esempio la fork()!
sinceramente non c'è niente di complicato nell'usare la fork, ed è il
modo naturale per lanciare processi che si vogliono, in seguito,
manipolare/gestire.
se puoi vuoi fare le cose  "un tanto al kilo" bah che ti posso dire...
lanci una nuova system del tipo :
"ps xa |grep nometuoprocesso | cut -d ' ' -f 2 > pid.txt"
cosi' nel file pid.txt hai il pid del tuo processo, se e' l'unico con quel
nome che gira, senno' hai la colonna dei pid dei processi con quello
stesso nome.
ciao
ps: usa la fork

 PID del processo che lancio con la funzione system() o execl()
Scusa non è possibile che la exec() o la system() non ritornano il PID 
del programma lanciato!! Posso sbagliarmi perchè non sono su linux ora, 
ma mi sembra alquanto strano!

 ha scritto nel messaggio 
news:d57ftm$j96$1...@newsreader.mailgate.org...


 Vorrei reperire il pid number di un processo lanciato attraverso la funzione 
Usa fork.  fork ritorna al genitore il PID del figlio; il figlio puo'
ritrovare quello del genitore con getppid .
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg


invece e' cosi'.
e' la fork che ritorna il pid, poi:
se killo il pid del figlio che ha lanciato il processo coin la exec allora
muore anche il processo che ho lanciato.
se invece il processo e' stato lanciato con una system allora il pid devo
rimedarlo dall'esterno, perche' la sistem fa essa stessa una fork su una
shell per poi lanciarne l'argomento. ma non ritorna il pid del processo
forkato
inoltre, lanciare un programma con una exec senza usare una fork... beh
allora il pid del processo lanciato con la exec e' lo stesso del processo
attuale, quindi il suo pid e' quello restituito dalla getpid. il problema
e' che se lo vuoi killare devi killare il processo padre...

 ha scritto nel messaggio 
news:pan.2005.05.03....@inwind.it...


Donato Grippo ha scritto:



Caspita quante ... imprecisioni ... in un solo thread!
Posso unirmi alla baldoria?
Allora vi dico come l' ho capita io. l' unico modo di generare un nuovo
processo secondo la dizione UNIX e fork() (per lo meno quello classico)
e tale chiamata ritorna per il padre il PID del figlio e per il figlio 0.
Quindi il padre sa chi ha generato e il figlio e' in grado di saperlo con
getppid(). Non e' complicato ed e' anche l' unico modo supportato da UNIX.
la famiglia di exec*() NON generano un nuovo processo, ma sostituiscono
l' attuale codice in esecuzione con quello caricato, gli passano
l' environment, args ... pero' il numero di processo per lo scheduler
rimane lo stesso. quindi fork() genera un PROCESSO, exec() esegue un
PROGRAMMA (cerco di formalizzare, ma correggetemi).
Nel codice che chiama exec() quindi si puo' gestire il codice di ritorno
di exec() solo per i casi di errore, exec() se eseguita con profitto, NON
ritorna al PROGRAMMA CHIAMANTE (il PROCESSO e' lo stesso, con cambio di
PROGRAMMA in esecuzione)
Perfino i filedescriptors rimangono validi se non settato close-on-exec!
system() e' una funzione di piu' alto livello delle libc standardizzata
e non cosi' flessibile. Si potrebbe riscrivere in termini di fork() +
exec() di /bin/sh -c a cui poi viene passata la stringa da esaminare.
la shell lanciata puo' generare altri processi esempio se fai ls |sort|
more
con ps vedi tutti i processi, non solo uno.
Consiglio: usa solo fork() + exec()! e' semplice ed hai il controllo
totale.
Per quanto possibile non usare system().
Ciao.
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Anche la exec ritorna il valore del''esito
A parte che se tu quotassi perbene (sotto il testo che citi) uno capirebbe
a cosa ti riferisci, la exec non e` bloccante (essere bloccanti o
meno e` una proprieta` che ha a che fare con l'I/O, non c'entra nulla
con la gestione dei processi). Ti consiglio un ripasso sui fondamenti di
Unix.
E come ti hanno gia` detto non puoi avere nel programma che la esegue il
suo pid dato che exec non ritorna (non in quel programma).  La exec
esegue, nello *stesso* processo, il programma che gli dici di eseguire. 
Te lo abbiano gia` detto, ma a quanto pare non lo vuoi intendere: se vuoi
uccidere un processo messo in esecuzione con exex devi prima fare una
fork, prenderti il pid del figlio, eseguire la exec nel figlio e uccidere
il processo con il pid suddetto nel padre. In Unix si fa cosi`. 
Ciao
Simone