find /usr -type f -name '*.pc' -print
Il a été développé par Dennis Ritchie au sein des laboratoires Bell (opérateur historique de télépĥonie aux États-Unis). Il est hautement portable, et des compilateurs disponibles pour tous les systèmes.
/* * gcc -Wall macro.c -o macro */ #include <stdio.h> #if !defined(ISO_CODES_PREFIX) #define ISO_CODES_PREFIX /usr #endif int main (int argc, char *argv[]) { printf ("%s\n", ISO_CODES_PREFIX); return 0; }
Après compilation, on obtient ceci
$ gcc -Wall macro.c -o macro $ ./macro /usr
On peut également définir une macro à l'aide de l'option -D.
Par exemple, Debian fournit une archive contenant la liste des pays définie selon la norme ISO.
Selon les systèmes d'exploitations, ce paquet peut être situé soit dans /usr
, /usr/local
ou /usr/pkg
. Donc pour connaître le dossier (préfix) où il est situé, on interroge généralement le fichier iso-codes.pc
1).
Sur une distribution Linux quelconque, on obtient ceci :
$ pkg-config --variable=prefix iso-codes /usr
Note : Sous FreeBSD, pkg-config
est un « alias » vers pkgconfig
.
En modifiant légèrement notre scipt, on peut récupérer cette information
/* * ISO_CODES_PREFIX=`pkg-config --variable=prefix iso-codes` * gcc -Wall -DISO_CODES_PREFIX=\"$ISO_CODES_PREFIX\" macro.c -o macro */ #include <stdio.h> int main (int argc, char *argv[]) { printf ("%s\n", ISO_CODES_PREFIX); return 0; }
$ ISO_CODES_PREFIX=`pkg-config --variable=prefix iso-codes` $ gcc -Wall -DISO_CODES_PREFIX=\"$ISO_CODES_PREFIX\" macro.c -o macro $ ./macro /usr
Le code ci-dessous fonctionne pour FreeBSD. Il permet d'afficher les notifications pris en charge par le noyau.
/** * gcc events.c -o events -Wall -W -Wextra -lc * * Access to kernel events through Unix socket. **/ #include <stdio.h> #include <stdlib.h> /* calloc (), malloc () */ #include <string.h> /* strlcpy () */ #include <unistd.h> /* close () */ #include <sys/types.h> #include <sys/socket.h> /* socket (), connect () */ #include <sys/un.h> /* struct sockaddr_un */ #include <sys/event.h> #define DEVD_FILE "/var/run/devd.pipe" void devd_init_monitor () { int fd, kq; struct sockaddr_un addr; struct kevent *chlist, evlist; chlist = malloc (sizeof (struct kevent)); fd = socket (PF_LOCAL, SOCK_STREAM, 0); if (fd < 0) fprintf (stderr, "Can't create socket\n"); addr.sun_family = AF_UNIX; strlcpy (addr.sun_path, DEVD_FILE, sizeof (addr.sun_path)); if (connect (fd, (struct sockaddr *) &addr, sizeof (addr)) < 0) { close (fd); fprintf (stderr, "Can't connect to DEVD daemon\n"); } if ((kq = kqueue ()) < 0) { close (fd); fprintf (stderr, "No kernel event queue\n"); } /* Initialise kevent structure */ EV_SET (chlist, fd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0); /* Infinite loop */ for (;;) { if (kevent (kq, chlist, 1, &evlist, 1, NULL) == 1) { char *buffer = calloc (evlist.data, sizeof (intptr_t)); recv (fd, buffer, evlist.data, 0); fprintf (stdout, "%s", buffer); free (buffer); } } free (chlist); } int main (int argc, char *argv[]) { devd_init_monitor (); return 0; }
find /usr -type f -name '*.pc' -print