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;; |
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;; |
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);; |
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 ».