Apache Portable Runtime

Introduction

La librairie APR fournit une API unifiée pour unix et win32.

Cette librairie couvre des services allant de l'allocation mémoire en passant par les sockets, la mémoire partagée, les threads ainsi que les tables de hash ou encore le parsing des dates.

Le document ci-joint montre comment utiliser cette API qui reste assez proche des API posix que l'on peut trouver sous unix.

Toutes les fonctions commencent par apr_ et renvoient une erreur de type apr_status_t qui vaut APR_SUCCESS en cas de succès.

La librairie APR-UTIL dépendante de la librairie APR fournit des services de plus haut niveau, comme par exemple le calcul de md5, le parsing de date ,d'uri et de fichiers xml, des outils de stockage de données etc ...

Compilation

Sous unix, on fait comme d'habitude (ici, on installe en local en précisant l'option --prefix):

$ ./configure --prefix=$HOME/apr
$ make
$ make install

Sous Windows, on utilise son environnement de développement préféré de chez Microsoft (Personnellement, j'utilise la version Beta 2 Express qui est gratuite). On ouvre le projet .dsw et on compile tous les projets.

Programme minimum

#include "apr_general.h"

int main( int argc, char * argv[] )
{
  apr_pool_t *pool;
  apr_status_t ret;

  /* Intialisation de la librairie*/
  ret = apr_initialize();
  if( ret  != APR_SUCCESS) 
  {
      printf( "Could not initialize\n");
       exit(-1);
  }
  
  /* Creation du pool racine */
  if (apr_pool_create(&pool, NULL) != APR_SUCCESS) 
  {
    printf( "Could not allocate pool\n");
    exit( -1);
  }
  
  /* Faire qqchose */
  ...
  
  /* Destruction du pool racine */
  apr_pool_destroy( pool );
  return 0;
}

Les pools (APR)

L'allocation de mémoire passe par l'utilisation de pools.

On créé en général un pool racine, et des pools enfants ou sous pool. La destruction d'un pool entraîne la destruction de l'ensemble des pools enfants.

Toutes les fonctions de l'APR qui ont besoin d'allouer de la mémoire ont recours à un pool que l'on passe en argument.

test_alloc.c

Les fichiers mappés en mémoire (APR)

Ce programme montre l'équivalent du mmap() d'unix.

Ici on mappe un fichier en mémoire et on y écrit des données avec des memcpy()

test_mmap.c

La mémoire partagée (APR)

Ce programme créé un segment de mémoire partagé et lance un process fils

Chaque process écrit en mémoire partagée (à un endroit différent ...)

En sortie, on affiche les données écrites

Ce programme montre aussi comment créer un process fils avec les APR

test_shm.c

Les threads, la synchronisation et les verrous de lecture/écriture (APR)

Ce programme illustre tout ce que l'on fait avec les threads

test_thread.c

Les sockets (APR)

Les 2 programmes suivants montrent comment utiliser les sockets en mode bloquant.

socket_client.c

socket_server.c

Les fichiers (APR)

Ce programme montre comment créer un fichier, lire et écrire des données dans ce fichier, le renommer et l'effacer.

test_file.c

Les tables de hash (APR)

Ajout de clés/valeurs et recherche par clé dans une table de hash.

test_hash.c

Passage d'arguments (getopt) (APR)

Ce programme montre comment parser élégamment les arguments de la ligne de commande, à la manière de getopt.

test_arg.c

Lecture écriture des variables d'environnement (APR)

Ce programme montre les équivalents de getenv() et setenv()

test_env.c

Les chaînes de caractères (APR)

Equivalent des strcpy(), strcat() etc...

test_string.c

Les tables ou listes de chaînes (APR)

Ce programme montre comment stocker des listes de chaînes.

test_table.c

Conversion base64 (APR-UTIL)

Ce programme montre comment convertir des données (éventuellement binaires) en base64 et vice-versa.

test_base64.c

Création de md5 (APR-UTIL)

Ce programme montre comment créer un md5.

test_md5.c

Création d'identifiant unique uuid(APR-UTIL)

Ce programme montre comment créer un UUID.

test_uuid.c

Stockage de données dans un fichier indexé (APR-UTIL)

Ce programme montre comment stocker des données dans un fichier indexé (dbm).

test_dbm.c

Parsing d'URI (APR-UTIL)

Ce programme montre comment parser une URI.

test_uri.c

Parsing XML (APR-UTIL)

Ce programme montre comment parser un fichier XML.

test_xml.c

Exemple de makefile

Ci dessous le makefile qui m'a servi pour les tests sous linux

A adapter selon votre configuration ...

makefile

Liens

Valid XHTML 1.0!