Ora come ora non posso leggermi tutto il codice per darti consigli "mirati", tra l'altro non so cosa contenga l'header file smallsh.h, ma di sicuro per realizzare una mini shell su Linux non puoi non conoscere funzioni dell'API Unix come execve() (e simili), fork(), wait() (e simili) e altro. Sbalgio o nel tuo codice non c'è traccia di tutto questo? Insomma, come stai tentando di procedere?
In ogni caso quello che una shell molto elementare dovrebbe fare sarebbe avere un processo principale che mostri a video il prompt e, per ogni comando generato, dovrebbe aprire un nuovo processo che esegua quel comando. Ora ci sono due scenari possibili: se il processo padre non attende la fine del processo figlio, in pratica il processo figlio sta già lavorando in background, questo perché il padre ti mostrerà subito il prompt di nuovo; se invece il padre si blocca in attesa della terminazione del figlio con una waitpid(), allora il comando avviato lavorerà in foreground e bloccherà la shell, quindi il prompt ti verrà mostrato di nuovo una volta conclusa l'esecuzione del comando.
L'altra domanda forse non l'ho capita: vuoi avere la possibilità di terminare l'esecuzione del comando da tastiera senza chiudere anche il programma principale (cioè la shell) ? Se è così, ancora una volta devi ricorrere all'API di Unix per la gestione dei processi, ma se non hai mai studiato nulla di tutto questo penso ti sarà difficile...