Una macro _syscall
la chiamata di sistema desiderata
Dove
Queste macro creano una funzione chiamata nome con gli argomenti specificati. Una volta inclusa la _syscall() nel proprio file sorgente, si può chiamare la chiamata di sistema con nome.
Le macro _syscall() non producono un prototipo. Occorrerà quindi crearne uno, specialmente per chi usa C++.
Le chiamate di sistema non devono per forza restituire solo codici di errore positivi o negativi. Occorrerà leggere il sorgente per essere sicuri di come ognuna di esse riporta gli errori. Solitamente, il valore di ritorno è il negato di un codice di errore standard, per esempio -EPERM. Le macro _syscall() restituiranno il risultato r della chiamata di sistema quando r è non-negativo, ma restituiranno -1 e imposteranno la variabile errno a -r quando r è negativo. Per i codici di errore si veda errno(3).
Quando si definisce una chiamata di sistema, gli argomenti DEVONO essere passati per valore o per puntatore (per gli aggregati come le strutture).
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <linux/unistd.h> /* per cose relative alle macro _syscallX */
#include <linux/kernel.h> /* per sysinfo struct */
_syscall1(int, sysinfo, struct sysinfo *, info);
/* Nota: se si copia direttamente dal sorgente nroff, ricordarsi di
TOGLIERE i caratteri `' in più nell'espressione di printf. */
int
main(void)
{
struct sysinfo s_info;
int error;
error = sysinfo(&s_info);
printf("code error = %d\n", error);
printf("Uptime = %lds\nLoad: 1 min %lu / 5 min %lu / 15 min %lu\n"
"RAM: total %lu / free %lu / shared %lu\n"
"Memory in buffers = %lu\nSwap: total %lu / free %lu\n"
"Number of processes = %d\n",
s_info.uptime, s_info.loads[0],
s_info.loads[1], s_info.loads[2],
s_info.totalram, s_info.freeram,
s_info.sharedram, s_info.bufferram,
s_info.totalswap, s_info.freeswap,
s_info.procs);
exit(EXIT_SUCCESS);
}
code error = 0 uptime = 502034s Load: 1 min 13376 / 5 min 5504 / 15 min 1152 RAM: total 15343616 / free 827392 / shared 8237056 Memory in buffers = 5066752 Swap: total 27881472 / free 24698880 Number of processes = 40