Pour recevoir le signal sigtstp (et ne pas être arrêté comme ce serait le cas par défaut), on redéfinit ce signal comme ne faisant rien: quand le processus fils s'exécutant en tâche frontale recevra ce signal et sera arrêté, le père recevra un statut WSTOPPED _ pour le processus concerné. Il faut donc redéfinir finish_fg pour traiter ce cas-là.
      
Sys.signal Sys.sigtstp (Sys.Signal_handle (fun _ -> ()));;

let finish_fg p =
  match wait_fg_son p with
  | WSTOPPED c as status ->
      eprintf "Process %d was stopped by signal %d.\n" p.pid c;
      flush Pervasives.stderr;
      add_process {p with status = Some status};
      127
  | s -> return_status s;;
On redéfinit donc les commandes fg et command_wait qui utilisent finish_fg.
      
let fg() =
  continue_last_process
    (fun p ->
      Printf.eprintf "Foregrounded job [%d] %s\n" p.pid p.cmd;
      flush Pervasives.stderr;
      remove_process p.pid;
      finish_fg p);;
let command_wait = launch_command finish_fg;;
Mettre un processus endormi en tâche de fond est une simple variante de fg.
      
let bg() =
  continue_last_process
    (fun p ->
      Printf.eprintf "Backgrounded job [%d] %s\n" p.pid p.cmd;
      flush Pervasives.stderr;
      free_bg_sons(); 0);;
Notez que lorsqu'un signal Ctrl-Z (ou Ctrl-C) envoyé au père il est également envoyé à tous les fils, qu'ils soient en tâche frontale ou en tâche de fond. Pour éviter cela, il faut changer le groupe des processus en tâche de fond. L'appel système setpgrp (voir man setpgrp) qui permet cela n'est pas relevé en OCaml. Mais ce serait nécessaire pour prétendre à une vraie « gestion des jobs ».