Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    24

    [C-unix] processo in background

    Salve a tutti.
    Sono nuovo qui, per cui mi scuso in anticipo per eventuali errori.

    Mi rivolgo a voi perchè ho un problema che non riesco a risolvere.
    In pratica ho un programma in c che simula una shelll, a cui però devo ancora aggiungere delle funzionalità. In sostanza prende i comandi e esegue tutto come la shell facendo fork e exec del comando che gli viene dato.
    Però non capisco come fare a fargli eseguire i comandi in background che la shell fa con &.
    Cioè: ora fa solo comandi in foreground, il padre aspetta che il figlio finisco e poi prosegue con un nuovo comando. Ma non capisco come implementare quelli in background.
    Perchè non fare semplicemente aspettare il padre è una soluzione sbagliata in quanto all'uscita di altri figli potrebbero esserci problemi.
    Credo che in qualche modo serva prendere il segnale del figlio che esce, ma non sarei sicuro.
    Grazie a tutti in anticipo.

  2. #2
    Ti puoi limitare a richiamare waitpid(-1, NULL, WNOHANG) finché non restituisce 0 prima di mostrare il prompt: in questa maniera eviti di avere processi "defunti" in giro ma non blocchi la shell.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    24
    ho cercato dettagli su waitpid()...con -1 al primo argomento (il pid) mi restituisce informazioni su tutti i i figli no?non è più sensato e utile, quando possibile, passargli il pid del figlio (o figli in caso di più processi in bg in fila) in questione?

    in ogni caso grazie

  4. #4
    Be', è sostanzialmente indifferente, tanto comunque il sistema operativo tiene traccia già di suo dei processi figli del tuo processo, per cui non è che gli stai facendo fare fatica aggiuntiva.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    24
    allora, ancora non ho provato ma mi è saltato in mente qualche problema.
    così facendo non ho lo stesso che avrei semplicemente non aspettando?cioè..metti che chiamo 'top &' e poi top; poi interrompo il processo di top &, il padre che aspettava top esce lo stesso dalla wait perchè gli arriva un segnale di uscita di un figlio.

    e la mia domanda era più a riguardo del caso in cui io chiami più processi in bg in fila.Come faccio a sapere di quale mi ha restituito 1?

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    24
    Allora..prima ho provato a sistemare con waitpid, purtroppo i problemi sono gli stessi che avevo ipotizzato..ho anche provato a creare un vettore di pid_t apposta per i processi in bg per poter tener traccia di quali processi occupassero quali posti...ma non funziona comunque..

  7. #7
    Originariamente inviato da wolf1792
    allora, ancora non ho provato ma mi è saltato in mente qualche problema.
    così facendo non ho lo stesso che avrei semplicemente non aspettando?cioè..metti che chiamo 'top &' e poi top; poi interrompo il processo di top &, il padre che aspettava top esce lo stesso dalla wait perchè gli arriva un segnale di uscita di un figlio.
    Per i processi in primo piano, subito dopo la fork() usa la waitpid (senza WNOHANG) passando il pid del processo figlio, in modo da aspettare solo l'uscita del processo specifico che hai lanciato.
    Per i processi in background, prima di mostrare di nuovo il prompt fai una waitpid "generica" (passando -1) con WNOHANG in loop, in modo da non bloccare se nessun processo in background è terminato, ma ottenere i codici di uscita (e rimuovere i processi "defunct") se ne sono terminati.
    e la mia domanda era più a riguardo del caso in cui io chiami più processi in bg in fila.Come faccio a sapere di quale mi ha restituito 1?
    Usi il valore restituito da waitpid.

    Basta fare una cosa del genere:
    codice:
    pid_t p;
    // Lancia il processo
    p=fork();
    if(p==0)
        exec(...);
    int status;
    // Wait per il processo in foreground
    if(processo foreground)
    {
        if(waitpid(p, &status, 0)==p)
        {
            int exitcode=WEXITSTATUS(status);
            // eccetera
        }
        else
        {
            // errore nella waitpid
        }
    }
    // Wait per i processi in background
    while((p=waitpid(-1, &status, WNOHANG))>0)
    {
        int exitcode=WEXITSTATUS(status);
        // il pid del processo terminato sta già in p
        // eccetera   
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    24
    grazie mille.
    Sinceramente anche leggendo la guida non avevo capito che il waitpid con -1 restituisse il pid del processo finito.
    Comunque dovrei essere riuscito riarrangiando un po'. Anche se è molto lontana dall'assomigliare alla bash XD

  9. #9
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.