Librairie Apr : tutoriel : fichier flock-sample.c
Note
Regardez le tutoriel au complet, en Anglais, ici.
Vous trouverez tout ce tutoriel séparé en plusieurs pages ici.
Ce fichier exemple vient d’ici.
/** * Exemple pour le tutoriel apr * http://dev.ariel-networks.com/apr/ */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <apr_general.h> #include <apr_file_io.h> static apr_status_t do_writelock(const char *fname, apr_pool_t *mp) { apr_status_t rv; apr_file_t *fp; if ((rv = apr_file_open(&fp, fname, APR_WRITE, APR_OS_DEFAULT, mp)) != APR_SUCCESS) { return rv; } rv = apr_file_lock(fp, APR_FLOCK_EXCLUSIVE | APR_FLOCK_NONBLOCK); /* si vous mettez le drapeau APR_FLOCK_NONBLOCK, apr_file_lock() ne fonctionnera pas. * Il faut toujours vérifier la valeur de retour */ if (rv != APR_SUCCESS) { puts("writable-lock failed"); goto done; } printf("%s est verrouillé en écriture.\n", fname); printf("Appuyez sur une touche pour le déverrouiller.\n"); getchar(); apr_file_unlock(fp); done: apr_file_close(fp); return rv; } static apr_status_t do_readlock(const char *fname, apr_pool_t *mp) { apr_status_t rv; apr_file_t *fp; if ((rv = apr_file_open(&fp, fname, APR_READ, APR_OS_DEFAULT, mp)) != APR_SUCCESS) { return rv; } rv = apr_file_lock(fp, APR_FLOCK_SHARED | APR_FLOCK_NONBLOCK); if (rv != APR_SUCCESS) { puts("Impossible de mettre le verrou en lecture."); goto done; } apr_file_unlock(fp); done: apr_file_close(fp); return rv; } /** * Exemple de verrou fichier * @remark Vérif. des erreur supprimée pour plus de clarté */ int main(int argc, const char *argv[]) { apr_status_t rv; apr_pool_t *mp; int c; const char *fname; if (argc < 2) { printf("Utilisation : %s fichier-de-sortie\n", argv[0]); return 0; } fname = argv[1]; apr_initialize(); apr_pool_create(&mp, NULL); puts("verrou-écriture / verrou-lecture [w/r]?"); c = getchar(); if (c == 'w') { rv = do_writelock(fname, mp); } else if (c == 'r') { rv = do_readlock(fname, mp); } apr_pool_destroy(mp); apr_terminate(); return 0; }