Ú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:

    _syscallX(typ,jméno,typ1,arg1,typ2,arg2,...)

        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.