|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
|
[C] Elenco dei processi figli
Salve gente,
è possibilie avere un elenco dei processi figli che ho genrato con il loro status attuale? |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
sistema operativo? e che intendi di preciso per status?
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: $HOME
Messaggi: 1213
|
se sei sotto linux :
puoi memorizzare i vari pid generati dalla fork(). Essa ritorna al padre il pid del processo creato. per lo status: puoi usare nel padre la sys call waitpid [spero di non sbagliarimi] che secondo a quale opzioni(3 parametro) gli passi ti indica se il processo e' terminato(in quale modo e da quale segnale). bye
__________________
Last.fm: My Profile / GamerTag XBL: Martcus / Flickr / deviantArt iBook 12'' / MacBook Pro 13'' / iPhone 3G 16GB Black / iPod 5G 30GB / iPod Nano 2G 4GB |
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
analogamente, se sei su Windows, puoi memorizzare i PID ritornati dalla CreateProcess oppure enumerare i processi con le Toolhelp e prendere solo quelli che hanno il tuo PID come processo padre; per lo "status" forse può esserti utile analizzare il valore di ritorno di GetExitCodeProcess e vedere se è uguale a STILL_ACTIVE.
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
|
in linux
solo che a me serve dei processi ancora in esecuzione (sto facendo una shell, quelli che praticamente sono eseguiti con la & finale) se faccio un wait mi si blocca, credo.. la variabile status (waitpid(pid,status,opzioni)), è un intero, come si interpreta? |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
|
altra cosa, con
pid = waitpid(WAIT_ANY, &status, WNOHANG); recupero praticamente tutti i figli morti (zombie), credo la funzione nn l'ho fatta io (è il sigchild).. come posso recuperare tutti i figli indistinatamente? |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
La waitpid è una systemcall e per come la chiami puoi usare anche una wait(&status), in modo che ti ritorni i lo status dei figli.
Per avere tutti i pid creati, puoi utulizzare un array di pid globale.
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
|
Quote:
mettiamo caso che ho un vettore di figli pid, come interrogo il loro status? waitpid(vpid[i],&status,0)? |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
La prima soluzione che mi viene è molto poco elegante, ma dovrebbe funzionare
nei figli associa ad un segnale un handler che risponde al padre via pipe o altro. Quando vuoi interrogare un figlio gli mandi un segnale e leggi dalla pipe, se ti ritorna 0(ricordati di chiudere la pipe prima di chiudere il figlio) sai che ha finito e puoi fare una wait, alternativamente puoi farti mandare qualche variabile che rappresenta lo stato che ti interessa, o eventualmente un semplice acknowledge. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
|
Quote:
|
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2004
Messaggi: 357
|
Quote:
si manda con kill, presumo che tu non sappia nemmeno come gestire un segnale, ovvero con signal nel man di linux trovi tutto saluti |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
|
Quote:
a me serve sapere se è running sleep ecc.. devo implementare il jobs per capirsi.. |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
|
allora va solo running exit stop. dello sleep nn so.
mi sapete dire una cosa? se do crtl+z mando in stop il programma, come lo ritiro su? |
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Pfff... tratto dal link che ho postato sopra.
Qui c'è, fondamentalmente, tutto quello che ti serve. Ovviamente lo devi adattare e integrare. Codice:
int check_children()
{
pid_t pid;
int status;
int count = 0;
while ((pid = waitpid(-1, &status, WNOHANG | WUNTRACED)) > 0)
{
if (pid == bgjob && !WIFSTOPPED(status))
bgjob = -1;
++count;
if (WIFEXITED(status))
fprintf(stderr,"Process %ld exited with return code %d\n",
(long)pid, WEXITSTATUS(status));
else if (WIFSIGNALED(status))
fprintf(stderr,"Process %ld killed by signal %d%s\n",
(long)pid, WTERMSIG(status),
WCOREDUMP(status) ? " (core dumped)" : "");
else if (WIFSTOPPED(status))
fprintf(stderr,"Process %ld stopped by signal %d\n",
(long)pid, WSTOPSIG(status));
else
fprintf(stderr,"Unexpected status - pid=%ld, status=0x%x\n",
(long)pid, status);
}
return count;
}
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
|
Quote:
per lo sleeping niente? |
|
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Forse il modo più semplice, se ho capito bene quello che intendi, considerato che dovresti avere l'elenco dei PID, potrebbe essere qualcosa del genere:
Codice:
jcd@big:~$ export PID=4419 jcd@big:~$ cat /proc/$PID/status | grep State State: S (sleeping) jcd@big:~$ |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Oct 2004
Città: Rovereto (tn)
Messaggi: 2187
|
ho ancora dei problemi.. dopo li posto.. cmq non funziona molto bene
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:35.



















