ÚVOD(2) | Linux - příručka programátora | ÚVOD(2) |
JMÉNO¶
intro - Úvod do volání jádra
POPIS¶
Tato kapitolka popisuje volání jádra v Linuxu.
Přímé volání¶
Ve většině případů není třeba volat systémové volání přímo, ale existují případy, kdy standardní knihovna jazyka C neobsahuje vhodnou funkci, která volání provede.
Syntaxe¶
#include <linux/unistd.h>
makro _syscall
předpokládané volání jádra
Implementace¶
Důležitou věcí, kterou je třeba o systémovém volání vědět, je jeho prototyp. Budete-li chtít toto volání použít, potřebujete vědět kolik má parametrů a jakého typu, jaký typ vrací. Je definováno šest maker, která usnadňují skutečná volání jádra. Mají tento tvar:
kde X je 0–5, což je počet argumentů pro dané systémové volání.
typ je návratový typ volání
jméno je jméno volání
typN je typ N-tého argumentu
argN je jméno N-tého argumentu
Tato makra vytvoří funkci se jménem name s Vámi specifikovanými argumenty. Jestliže vložíte _syscall() do Vašeho zdrojového souboru, budete moci používat systémové volání pod jménem name.
PŘÍKLAD¶
#include <stdio.h> /* zde jsou definována makra _syscallX() */ #include <linux/unistd.h> /* definice struct sysinfo */ #include <linux/kernel.h> _syscall1(int, sysinfo, struct sysinfo *, info); /* Poznámka: jestliže budete tento příklad kopírovat přímo ze zdrojového textu této manuálové stránky, nezapomeňte odstranit přebytečná obrácená lomítka u znaku \n */ int main(void) {
struct sysinfo s_info;
int error;
error = sysinfo(&s_info);
printf("code error = %d\n", error);
printf("Uptime = %ds\nLoad: 1min %d / 5min %d / 15min %d\n"
"RAM: total %d / free %d / shared %d\n"
"Memory in buffers = %d\nSwap: total %d / free %d\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);
return(0); }
Příklad výstupu¶
code error = 0 uptime = 502034s Load: 1min 13376 / 5min 5504 / 15min 1152 RAM: total 15343616 / free 827392 / shared 8237056 Memory in buffers = 5066752 Swap: total 27881472 / free 24698880 Number of processes = 40
POZNÁMKY¶
Makro _syscall() nevytváří prototyp. Musíte si jej vytvořit, což platí hlavně pro C++.
Systémová volání nemusí vracet kladné nebo záporné chybové kódy. Musíte si přečíst jejich zdrojový text, abyste se ujistili, co mohou vrátit. Obvykle je to opačná hodnota standardní chyby, např. -EPERM. Makra _syscall() vrací hodnotu r systémového volání , je-li nezáporná, jinak vrací -1 a nastaví hodnotu errno na -r.
Některá systémová volání, jako např. mmap, požadují více než pět argumentů. Toto se obchází umístěním argumentů na vrchol zásobníku. Potom jako argument volání použijeme ukazatel na blok argumentů.
Při definici volání jádra MUSÍ být argumenty volány hodnotou nebo odkazem (pro struktury).
SOUBORY¶
/usr/include/linux/unistd.h
AUTOŘI¶
Autory a podmínky pro šíření a kopírování najdete v záhlaví každé manuálové stránky. Všimněte si, že se mohou stránku od stránky lišit.
VAROVÁNͶ
Překlad je pravděpodobně zastaralý. Pokud chcete pomoci s jeho aktualizací, zamiřte na http://man-pages-cs-wiki.homelinux.net/
18.ledna 1997 | Linux 1.2.13 |