Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797

    [C] wait del figlio

    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:
    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);
    	}
    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.
    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
    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());
        }
    invece non funziona come dovrebbe..
    altro problemone:mi sono accorto che lascio zombi in giro, COME DIAVOLO LI UCCIDO?

    grazie

  2. #2
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797
    devo aver sbagliato a mettere dei commenti sopra..
    il wait sembra sistemato, ora resta da uccidere i figli quando sono defunct.. come faccio controllare lo stato di un processo?

  3. #3
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    se non ricordo male questo genere di problema si risolve in altro modo....
    Il tuo processo shell se vuole lanciare un processo in background deve prima creare un figlio e questo a sua volta deve crearne un altro, quest'ultimo lancerà il tuo comando:


    shell->figlio->nipote(comando)


    dopo aver lanciato nipote(comando) il figlio deve terminare. Questo fa sì che nipote rimanga orfano. In questa situazione il nipote viene ereditato dal processo di sistema Init che si occuperà si fare le opportune wait. La shell ovviamente non dovrà fare nessuna wait.
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  4. #4
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797
    Originariamente inviato da Habanero
    se non ricordo male questo genere di problema si risolve in altro modo....
    Il tuo processo shell se vuole lanciare un processo in background deve prima creare un figlio e questo a sua volta deve crearne un altro, quest'ultimo lancerà il tuo comando:


    shell->figlio->nipote(comando)


    dopo aver lanciato nipote(comando) il figlio deve terminare. Questo fa sì che nipote rimanga orfano. In questa situazione il nipote viene ereditato dal processo di sistema Init che si occuperà si fare le opportune wait. La shell ovviamente non dovrà fare nessuna wait.
    quindi dovrei fare un nipote e far far a lui quello che fa il figlio e quello che fa (adesso il padre) lo farà il figlio?

  5. #5
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    Il nipote fa quello che ora fa il figlio.
    Il figlio dopo aver lanciato il nipote deve terminare e basta...

    If figlio fa (schematicamente)


    if (fork()==0)
    {
    execvp(...)
    }
    else
    {
    exit(0);
    }
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  6. #6
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797
    Originariamente inviato da Habanero
    Il nipote fa quello che ora fa il figlio.
    Il figlio dopo aver lanciato il nipote deve terminare e basta...

    If figlio fa (schematicamente)


    if (fork()==0)
    {
    execvp(...)
    }
    else
    {
    exit(0);
    }
    credo funzioni, manca solo il wait prima dell'exit mi sa
    adesso testo.!

  7. #7
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797
    invece no. resta lo zombie di a.out (cioè il filgio)..
    devo trovare il modo di sapre come sta il figlio, e se defunto fare un kill
    basterebbe sapere chi è il padre, se è init lo uccido..
    idee?

  8. #8
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    il figlio non deve fare wait... sta proprio li il fatto.... se il figlio fa wait non termina finchè non finisce il nipote e questo non viene ereditato dal processo di sistema.
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

  9. #9
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797
    Originariamente inviato da Habanero
    il figlio non deve fare wait... sta proprio li il fatto.... se il figlio fa wait non termina finchè non finisce il nipote e questo non viene ereditato dal processo di sistema.
    per stampare quando muore il nipote, come faccio?
    dove devo mettere il tutto?

  10. #10
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797
    Originariamente inviato da Habanero
    il figlio non deve fare wait... sta proprio li il fatto.... se il figlio fa wait non termina finchè non finisce il nipote e questo non viene ereditato dal processo di sistema.
    il figlio è pid 11700
    il nipote è il pid 11701
    quando chiudo il nipote se ne va, ma resta
    stefano 11700 0.0 0.0 0 0 pts/1 Z+ 23:50 0:00 [a.o] <defunct>
    quindi è lo stesso problema di prima..
    PS: è uno zombie quello?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.