INTRO(2)

NOME
intro, _syscall - Introduzione alle chiamate di sistema

DESCRIZIONE
Questo capitolo descrive le chiamate di sistema di Linux. Per un elenco delle chiamate di sistema di Linux si veda syscalls(2).

  Chiamata diretta
In molti casi, non è necessario invocare direttamente una chiamata di sistema, ma alcune volte la libreria C Standard non implementa una funzione che soddisfa le proprie necessità. In questo caso il programmatore deve invocare manualmente la chiamata di sistema usando syscall(2). Storicamente era possibile farlo anche usando una delle macro di _syscall descritte sotto.

  Sintassi
#include <linux/unistd.h> Una macro _syscall la chiamata di sistema desiderata

  Impostazioni
La cosa importante da sapere sulle chiamate di sistema è il loro prototipo. Bisogna conoscere il numero di argomenti, il loro tipo, e il tipo di ritorno della funzione. Ci sono sei macro che rendono più facile la reale chiamata nel sistema. Hanno il formato:

    _syscallX(tipo,nome,tipo1,arg1,tipo2,arg2,...)

        Dove X è tra 0 e 5, che sono il numero di argomenti presi dalla chiamata di sistema

        tipo è il tipo di ritorno della chiamata di sistema

        nome è il nome della chiamata di sistema

        tipoN è il tipo dell'N-esimo argomento

        argN è il nome dell'N-esimo argomento

Queste macro creano una funzione chiamata nome con gli argomenti specificati. Una volta che si è inclusa la _syscall() nel proprio file sorgente, si può chiamare la chiamata di sistema con nome.

FILE
/usr/include/linux/unistd.h

CONFORME A
Alcuni codici vengono usati per indicare varianti di Unix e standard ai quali le chiamate descritte in questa sezione si adeguano. Vedere standards(7).

NOTE
A partire dal kernel 2.6.18 le macro di _syscall sono state rimosse dai file di intestazione messi a disposizione nello spazio utente. Si usi syscall(2) al loro posto. (Alcune architetture, in particolare la ia64, non ha mai messo a disposizione le macro _syscall: su queste architetture è sempre stato richiesto syscall(2). La macro _syscall() non produce un prototipo. Occorrerà quindi crearne uno, specialmente per i programmatori C++.

Le chiamate di sistema non devono per forza ritornare un valore positivo o un codice di errore negativo. 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 standardizzato, come -EPERM. Le macro _syscall() ritorneranno il risultato r della chiamata di sistema quando r è non-negativo, ma ritorneranno -1 e assegneranno ad errno il valore -r quando r è negativo. Per i codici di errore si veda errno(3). Alcune chiamate di sistema, come mmap(2), richiedono più di cinque argomenti. Questi vengono gestiti spingendo gli argomenti sullo stack e passando un puntatore al blocco degli argomenti. Quando si definisce una chiamata di sistema, gli argomenti DEVONO essere passati per valore o per puntatore (questo nel caso di aggregati, come le strutture).

ESEMPIO

#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);
}

  Esempio di Output
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

VEDERE ANCHE
syscall(2), errno(3), feature_test_macros(7), standards(7)