Dans le cas où la ligne de commande se termine par &, il suffit que le processus père n’appelle pas wait, et passe immédiatement au prochain tour de la boucle. Seule difficulté: le père peut maintenant avoir plusieurs fils qui s’exécutent en même temps (les commandes en arrière-plan qui n’ont pas encore terminé, plus la dernière commande synchrone), et wait peut se synchroniser sur l’un quelconque de ces fils. Dans le cas d’une commande synchrone, il faut donc répéter wait jusqu’à ce que le fils récupéré soit bien celui qui exécute la commande.
     
       while true do
         let cmd = input_line Pervasives.stdin in
         let wordsampersand = parse_command_line cmd in
         match fork() with
           0 -> exec_command words
         | pid_son ->
             if ampersand then ()
             else
               let rec wait_for_son() =
                 let pidstatus = wait () in
                 if pid = pid_son then
                   print_status "Program" status
                 else
                   let p = "Background program " ^ (string_of_int pidin
                   print_status p status;
                   wait_for_son() in
               wait_for_son()
       done