&
, 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 words, ampersand = parse_command_line cmd in match fork() with 0 -> exec_command words | pid_son -> if ampersand then () else let rec wait_for_son() = let pid, status = wait () in if pid = pid_son then print_status "Program" status else let p = "Background program " ^ (string_of_int pid) in print_status p status; wait_for_son() in wait_for_son() done |