Précédent Index Suivant

Module Unix

On trouve dans ce module l'interface avec les principales fonctions des bibliothèques du système Unix. Cependant, comme nous l'avons déjà signalé, une partie importante de ce module a été portée sous Windows et est donc accessible depuis ce dernier. Nous signalerons, lorsque nécessaire, les restrictions d'utilisation des fonctions présentées. Un tableau résumant ces restrictions est donné figure 18.1.

La bibliothèque Unix fait partie des bibliothèques non standard d'Objective CAML qu'il est nécessaire de lier par la commande -custom du compilateur (voir chapitre 7, page ??). Suivant l'usage que l'on destine au programme, on écrit sous Unix l'une des commandes suivantes, pour obtenir du code-octet, du code natif ou une boucle d'interaction :
$ ocamlc -custom unix.cma  fichiers.ml -cclib -lunix
$ ocamlopt unix.cma fichiers.ml -cclib -lunix
$ ocamlmktop -custom -o unixtop unix.cma -cclib -lunix 
L'intérêt de construire une boucle d'interaction (dont le nom sera ici unixtop) est de permettre un développement incrémentiel. On obtient rapidement la compilation de chaque fonction avec son indication de type. On peut même procéder à quelques tests fonctionnels.

Suivant l'Unix utilisé, la bibliothèque système peut ne pas être à l'emplacement prévu par défaut. Si nécessaire, on peut préciser le chemin d'accès des bibliothèques avec l'option -ccopt (voir chapitre 7).

Sous Windows, les commandes de compilation deviennent :
$ ocamlc -custom unix.cma  fichiers.ml %CAMLLIB%\libunix.lib wsock32.lib
$ ocamlopt unix.cma fichiers.ml %CAMLLIB%\libunix.lib wsock32.lib
$ ocamlmktop -custom -o unixtop.exe unix.cma %CAMLLIB%\libunix.lib wsock32.lib
Le nom de la boucle d'interaction ainsi obtenue est unixtop.exe.

Gestion des erreurs

Les erreurs provoquées par les appels système déclenchent l'exception Unix_error qui peut être traitée depuis un programme Objective CAML. Cette erreur contient trois arguments : une valeur de type Unix.error qu'il est possible de traduire sous forme d'une chaîne de caractères par la fonction error_message, une chaîne contenant le nom de la fonction ayant provoqué l'erreur et une chaîne contenant éventuellement l'argument de la fonction lorsqu'il est de type string.

On peut ainsi définir une fonction générique d'appel de fonction et de traitement des erreurs :

# let capsule_unix fonct arg =
try (fonct arg) with
Unix.Unix_error (e,fm,argm) ->
Printf.printf "%s %s %s" (Unix.error_message e) fm argm ;;
val capsule_unix : ('a -> unit) -> 'a -> unit = <fun>
La fonction capsule_unix prend une fonction, son argument et applique l'une à l'autre. Si une erreur Unix survient, un message explicatif est affiché. Une fonction équivalente est définie dans le module Unix :

# Unix.handle_unix_error ;;
- : ('a -> 'b) -> 'a -> 'b = <fun>


Portabilité des appels système

La figure 18.1 indique quelles fonctions, de communication et de gestion des processus, présentées dans ce chapitre sont accessibles sous Windows. Les deux manques principaux sont la fonction fork pour la duplication du processus courant et la fonction kill d'émission de signaux.

Fonction Unix Windows Commentaire
openfile × ×  
close × ×  
dup × ×  
dup2 × ×  
read × ×  
write × ×  
lseek × ×  
execv × ×  
execve × ×  
execvp × ×  
execvpe × ×  
fork ×   utiliser create_process
getpid × ×  
sleep × ×  
wait ×    
waitpid × × uniquement pour un numéro de
      processus donné
create_process × ×  
create_process_env × ×  
kill ×    
pipe × ×  
mkfifo ×    
open_process ×   utilise l'interprète de commandes
      /bin/sh
close_process ×    

Figure 18.1 : Portabilité des fonctions du module Unix utilisées dans ce chapitre


De plus la fonction wait d'attente de fin d'un processus fils n'est pas implantée car fork ne l'est pas.


Précédent Index Suivant