intro

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

              _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.

VAROVÁNÍ
       Překlad je pravděpodobně zastaralý. Pokud chcete pomoci s jeho
       aktualizací, zamiřte na http://man-pages-cs-wiki.homelinux.net/



Linux 1.2.13                      18.ledna 1997                          ÚVOD(2)