PDA

Visualizza la versione completa : [C-unix] processo in background


wolf1792
19-05-2013, 19:21
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.

MItaly
19-05-2013, 22:01
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.

wolf1792
19-05-2013, 23:33
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 ;)

MItaly
20-05-2013, 00:36
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. :)

wolf1792
20-05-2013, 10:19
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?

wolf1792
22-05-2013, 19:16
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..

MItaly
22-05-2013, 19:51
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:


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
}

wolf1792
23-05-2013, 10:22
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

MItaly
23-05-2013, 16:20
:ciauz:

Loading