Table des matières

Le langage C

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.

Définir une macro

/*
 * 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

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.

events.c
/**
* 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;
}
1)
La localisation varie selon les systèmes, find /usr -type f -name '*.pc' -print