====== Le langage C ======
Il a été développé par [[http://fr.wikipedia.org/wiki/Dennis_Ritchie|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.
===== Définir une macro =====
/*
* gcc -Wall macro.c -o macro
*/
#include
#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 [[http://pkg-isocodes.alioth.debian.org/|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'' ((La localisation varie selon les systèmes, ''find /usr -type f -name '*.pc' -print'')).
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
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
===== Afficher les « events » du noyau [FreeBSD] =====
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
#include /* calloc (), malloc () */
#include /* strlcpy () */
#include /* close () */
#include
#include /* socket (), connect () */
#include /* struct sockaddr_un */
#include
#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;
}