====== 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; }