Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] fork e riavvio processo

    Ciao!


    Sto facendo un progetto per la scuola che mi chiede di creare, tramite fork, dei processi figlio che avviino un terminale unix ognuno, e fin qui ci sono.
    Mi blocco pero' quando mi viene chiesto che il processo figlio venga riavviato nel momento in cui il terminale aperto venga chiuso(mentre il processo padre e' ancora aperto ed attivo).

    Il codice,grossolanamente, e' cosi':

    codice:
    pid = fork()
     if (pid == 0)
     {
     //processo figlio
     } 
    else
     {
     //processo padre 
    }

    Come posso implementare?

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Mi blocco pero' quando mi viene chiesto che il processo figlio venga riavviato nel momento in cui il terminale aperto venga chiuso(mentre il processo padre e' ancora aperto ed attivo).
    Riavviare un processo? Cosa intendi?

  3. #3
    col fork eseguo un comando che apre un terminale e questo terminale deve rimanere aperto finche' l'utente non preme INVIO.
    Nel momento in cui uno dei terminali viene chiuso(senza premere INVIO) il processo padre deve riavviarlo.In pratica deve monitorare che non venga chiuso e nel caso venisse chiuso lo deve riavviare.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    20
    potresti lavora con la funzione signal().
    tipo:
    codice:
    signal(SIGHUP, gestione_segnale);
    // questo per gestire l'evento di quando chiudi la shell cliccando sulla x
    
    void gestione_segnale(int segnale_ricevuto){
    // gestione segnale
    }

  5. #5
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Quando esegui la exec per lanciare il processo che lancia il terminale, il pid del processo non cambia.Per cui quando la shell si chiude il programma lanciato con la exec termina e puoi benissimo usare la funzione waitpid per aspettare che tale processo termini.Se termina ne puoi creare uno nuovo.

  6. #6
    Grazie,anzitutto,per le risposte.

    Sono riuscito con il waitpid ad aspettare che la shell terminasse e riavviarla,c'e' pero' un problema...me le avvia una per volta ,mentre la consegna dice che devono essere avviati tutti contemporaneamente i processi figli.

    Per esempio, se scrivo cosi':
    codice:
    for(i=1; i <= argc; i++)
       {
            
            pid = fork();
     	if ( pid == 0)
            {
            cmd = argv[i];
            strcat(cmd,";read");
            execl("/usr/bin/xterm","/usr/bin/xterm","-e",cmd,(char *)0);
            }
            else{ 
           
            
            }

    Mi avvia tutti i terminali contemporaneamente.

    Se invece aggiungo il waitpid:

    codice:
    for(i=1; i <= argc; i++)
       {
            
            pid = fork();
     	if ( pid == 0)
            {
            cmd = argv[i];
            strcat(cmd,";read");
            execl("/usr/bin/xterm","/usr/bin/xterm","-e",cmd,(char *)0);
            }
            else{ 
            waitpid(-1,&pid,0);
            i--;
            
            }
    Me li riavvia se si chiudono ma li esegue uno alla volta.Come faccio ad avviarli tutti assieme pur mantenendo la possibilita' di riavviarli in caso di chiusura?

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Puoi benissimo risolvere questo problema utilizzando un' altra fork() .
    Per ogni terminale utilizzi 2 processi, uno che esegue la execl ed un altro che aspetta che quest' ultimo termini e appena termina ne lancia uno nuovo:

    codice:
    for(i=1; i <= argc; i++)
    {
            pid = fork();
     	if ( pid == 0)
            {
                while(1)
                {
                // il loop indefinito può causare problemi, utilizza la signal per
                // gestire la terminazione di ogni processo.
                    pid=fork();
                    if(!pid)
                    {
                        cmd = argv[i];
                        strcat(cmd,";read");
                        execl("/usr/bin/xterm","/usr/bin/xterm","-e",cmd,(char *)0);
                    }
                    else
                    {
                         waitpid(-1,&pid,0);
                    }
                }
            }
    }

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.