Come implementare la funzionalità di comandi bg, &, e fg nel mio programma shell unix personalizzato scritto in C

4

Sto estendendo le funzionalità di una shell unix personalizzata che ho scritto come parte del mio compito di laboratorio. Attualmente supporta tutti i comandi tramite chiamate execvp, comandi incorporati come pwd, cd, cronologia, eco ed esportazione e anche reindirizzamento e pipe. Ora volevo aggiungere il supporto per l'esecuzione di un comando in background, ad es. $ ls -la & Voglio anche implementare i comandi di controllo del lavoro bg e fg.

So che questo può essere ottenuto se eseguo il comando biforcando un nuovo processo figlio e non aspettandolo nel processo genitore. Ma come faccio a portare nuovamente questo comando in foreground usando fg? Ho l'idea di inserire ogni comando di sfondo in una lista che assegna a ciascuno di essi un numero di serie. Ma non so come faccio a eseguire i processi in background, per poi riportarli in primo piano. Credo che le chiamate di sistema wait () e waitpid () sarebbero utili ma non mi sento a mio agio con loro. Ho provato a leggere le pagine man ma sono ancora nell'oscurità. Qualcuno può spiegare in un linguaggio di un laico come ottenere ciò nella programmazione del sistema UNIX? E ha qualcosa a che fare con i segnali SIGCONT e SIGSTP?

    
posta user1631009 30.08.2012 - 07:25
fonte

2 risposte

4

La sospensione di un comando (CTRL-Z) funziona inviando un SIGTSTP al processo figlio. La shell è quindi libera di interagire con l'utente tramite stdin / stdout.

La ripresa viene eseguita inviando SIGCONT al processo figlio e quindi continuando ad attendere che finisca.

Lo sfondo di un processo si ottiene inviando SIGCONT ma non in attesa che finisca. In questo caso, sia la shell che il processo figlio possono interagire con stdout / stderr, ma lo stdin viene generalmente intercettato dalla shell.

L'avvio di un processo in background avviene eseguendo fork / exec, ma non bloccando fino a quando il processo figlio non esiste.

Tipicamente (come sempre) una shell gestirà anche SIGCHLD , che è il modo in cui il sistema operativo notifica al processo padre che un processo figlio ha terminato in modo che il genitore possa raccogliere il codice di uscita. Altrimenti si finisce con i processi "zombi"; quelli che non sono in esecuzione ma che non sono stati ancora raccolti da un genitore.

    
risposta data 02.10.2012 - 23:39
fonte
0

Suggerirei di leggere i capitoli pertinenti di Programmazione avanzata nell'ambiente Unix di W. R. Stevens. Ci sono molte informazioni di base da sapere e questo è l'unico posto in cui so per certo che è presente in un modo comprensibile.

    
risposta data 30.08.2012 - 11:32
fonte

Leggi altre domande sui tag