SINTASSI
#include <linux/unistd.h>Una macro _syscall
la chiamata di sistema desiderata
DESCRIZIONE
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 sette 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 6, 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 inclusa la _syscall() nel proprio file sorgente, si può chiamare la chiamata di sistema con nome.
FILE
/usr/include/linux/unistd.hCONFORME A
L'uso di queste macro è specifico di Linux, ed è deprecato.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)).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, i tipi di argomento devono essere passati per valore o per puntatore (per gli 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
COLOPHON
Questa pagina fa parte del rilascio 3.73 del progetto Linux man-pages. Una descrizione del progetto, le istruzioni per la segnalazione degli errori, e l'ultima versione di questa pagina si trova su http://www.kernel.org/doc/man-pages/.
La versione italiana fa parte del pacchetto
man-pages-it
v. 3.73, a cura di:
ILDP "Italian Linux Documentation Project"
http://www.pluto.it/ildp
Per la traduzione in italiano si può fare riferimento a
http://www.pluto.it/ildp/collaborare/
Segnalare eventuali errori di traduzione a
[email protected]