Ho un piccolissimo problema.. devo realizzare una shell, e devo implementare l'&.
& permette di far eseguire il programma, mentre la shell si può continuare ad usare. senza la & la shell resta bloccata fino a che nn termina il programma.
il codice che ho fatto è questo:
fin qui fa tutto o quasi quello che deve fare, il problema è che se eseguo ad esempio gimp & e poi chiudo gimp, resta uno zombie.codice:if (strcmp(argv[last(argv)],"&") != 0) //Se c'è la & devi aspettare { f_wait=0; } else {f_wait=1; argv[last(argv)]=NULL;} // altrimenti NON aspetti e togli la & dal vettore pid=fork(); if (pid==0){//figlio printf("%d \n",getpid()); execvp(argv[0],argv); }//fine if else {//padre if (f_wait==0) { waitpid(pid,&status,0); }
come lo uccido?
metto un kill(pid) dopo il waitpid? (c'ho provato ma non funziona).
poi vorrei che stampasse, quando si mette la & il pid e il numero di figli che ho in giro, e alla chiusura dia pid e done.. come fa la shell normale..
io credevo di aggiungere
invece non funziona come dovrebbe..codice:if (pid==0){//figlio if (f_wait==1){ n_zombie++; printf("[%d] %d \n",n_zombie,getpid()); } execvp(argv[0],argv); }//fine if else {//padre if (f_wait==0) { waitpid(pid,&status,0); kill(pid); n_zombie--; printf("[%d] %d DONE\n",n_zombie,getpid()); }
altro problemone:mi sono accorto che lascio zombi in giro, COME DIAVOLO LI UCCIDO?
grazie

Rispondi quotando