PDA

View Full Version : [C] Zombie


Sirbako
05-05-2006, 10:21
Salve gente,
ho un probelama, devo creare una sorta di shell, e devo implementare la & (che permette di continuare ad usare la shell anche quando si esegue un programma).

il codice è più o meno così



pid=fork();
if (!pid){
execvp(argv[0],argv);
}
else {
/* se deve aspettare, la & non c'è */
if (f_wait) {
/* fa un wait sul figlio */
waitpid(pid,&status,0);
}


il problema è che il filgio, una volta eseguito il porgramma diventa uno zombie, e io dovrei ucciderlo..
mi sono spiegato?
come posso fare?

sottovento
05-05-2006, 10:36
Penso che basti leggere il valore di ritorno

Sirbako
05-05-2006, 10:40
Penso che basti leggere il valore di ritorno
e come?

sottovento
05-05-2006, 10:50
e come?

http://www.eng.cam.ac.uk/help/tpl/unix/fork.html

Sirbako
05-05-2006, 11:16
io ho fatto così

void controlla_figli(){

int pid,status;

do {

pid = waitpid(WAIT_ANY, &status, WNOHANG);

if (pid > 0) {

printf("%d DONE %x \n", pid, status);

}

} while (pid > 0);

}

viene eseguita nel padre


pid=fork();
if (!pid){
execvp(argv[0],argv);
}
else {
/* se deve aspettare, la & non c'è */
if (f_wait) {
/* fa un wait sul figlio */
waitpid(pid,&status,0);
}
controlla_figli();
}

così funziona, sembra!

si può fare in modo più corto?

h1jack3r
05-05-2006, 12:26
si può fare in modo più corto?

Prediligi sempre la chiarezza del codice alla brevità. Indipendentemente dal programma che stai scrivendo, due righe in più non ti cambiano nulla.

sottovento
05-05-2006, 16:11
si può fare in modo più corto?

A dirla tutta, mi sembra che tu abbia fatto un buon lavoro.

High Flying
Sottovento