Provided by: manpages-pl-dev_20051117-1_all bug

NAZWA

       intro - wprowadzenie do wywołań systemowych

OPIS

       Ten  dział  opisuje  wywołania  systemowe Linuksa. Listę wszystkich 164
       wywołań systemowych obecnych w  jądrze  2.0  Linuksa  można  znaleźć  w
       syscalls(2).

   Wywoływanie bezpośrednie
       W   większości   przypadków  nie  jest  konieczne  wywoływanie  wywołań
       systemowych bezpośrednio, ale czasem zdarza się,  że  jakieś  przydatna
       funkcja  systemowa  nie jest zaimplementowana w standardowej bibliotece
       C.

   Składnia
       #include <linux/unistd.h>

       Makro _syscall

       żądane wywołanie systemowe

   Konfiguracja
       Ważną rzeczą, którą należy wiedzieć o wywołaniu  systemowym  jest  jego
       prototyp.   Trzeba  wiedzieć  ile  posiada ono argumentów, jakie są ich
       typy i jaki typ zwraca.  Istnieje  sześć  makrodefinicji  ułatwiających
       bezpośrednie wywołania systemu. Ich składnia jest następująca:

              _syscallX(type,name,type1,arg1,type2,arg2,...)

                     gdzie  X  jest  z zakresu 0-5 i oznacza liczbę argumentów
                             wymaganych przez wywołanie systemowe

                     type jest zwracanym typem

                     name jest nazwą wywołania systemowego

                     typeN jest typem N-tego argumentu

                     argN jest nazwą N-tego argumentu

       Te makrodefinicje tworzą funkcję o nazwie name z podanymi  argumentami.
       Po  zawarciu  _syscall()  w  pliku źródłowym, można wywoływać wywołanie
       systemowe poprzez name.

PRZYKŁAD

       #include <stdio.h>
       #include <linux/unistd.h>     /* dla makra _syscallX */
       #include <linux/kernel.h>     /* dla struktury sysinfo*/

       _syscall1(int, sysinfo, struct sysinfo *, info);

       /* Uwaga: jeśli kopiowanie odbywa się bezpośrednio ze źródła nroff,
       należy pamiętać, aby usunąć dodatkowe znaki `' z printf */

       int main(void)
       {
            struct sysinfo s_info;
            int error;

            error = sysinfo(&s_info);
            printf("code error = %d\n", error);
               printf("Uptime = %ds\nLoad: 1 min %d / 5 min %d / 15 min %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);
       }

Przykładowe wyjście

       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

UWAGI

       Makra _syscall() NIE tworzą prototypu. Może istnieć potrzega stworzenia
       go samodzielnie, szczególnie w przypadku korzystania z C++.

       Wywołania  systemowe nie muszą koniecznie zwracać jedynie dodatnich lub
       ujemnych kodów błędu. Trzeba przeczytać źródło, aby  upewnić  się,  jak
       zwracają  one błędy. Zazwyczaj jest to standardowy kod błędu ze znakiem
       ujemnym, np.  -EPERM.  Makra  _syscall()  zwracają  wynik  r  wywołania
       systemowego jeśli r jest nieujemne, ale zwracają -1 i zmieniają wartość
       errno na -r jeśli r jest ujemne. Kody błędów można znaleźć w  errno(3).

       Niektóre  wywołania  systemowe,  takie  jak  mmap,  wymagają więcej niż
       pięciu argumentów. Jest to osiągane poprzez umieszczanie argumentów  na
       stosie i przekazywanie wskaźnika do bloku argumentów.

       Podczas  definiowania  wywołania  systemowego,  typy  argumentów  MUSZĄ
       zostać przekazane przez wartość lub przez wskaźnik (dla aregatów takich
       jak struktury).

ZGODNE Z

       W  tym  rozdziale  występują  odwołania  do  różnych  wersji  Uniksa  i
       standardów realizowane poprzez skróty. Są to:

       SVr4   System V Release  4  Unix,  opisane  w  "Programmer's  Reference
              Manual:  Operating System API (Intel processors)" (Prentice-Hall
              1992, ISBN 0-13-951294-2)

       SVID   System V Interface Definition, opisane w "The System V Interface
              Definition, Fourth Edition".

       POSIX.1
              IEEE 1003.1-1990 part 1, aka ISO/IEC 9945-1:1990s, inaczej "IEEE
              Portable Operating System Interface for Computing Environments",
              wyjaśnione   w   "POSIX  Programmer's  Guide"  Donalda  Lewine'a
              (O'Reilly & Associates, Inc., 1991, ISBN 0-937175-73-0.

       POSIX.1b
              IEEE Std 1003.1b-1993 (POSIX.1b standard)  opisujący  mechanizmy
              czasu   rzeczywistego   w  przenośnych  systemach  operacyjnych,
              inaczej ISO/IEC 9945-1:1996, wyjaśnione w  "Programming for  the
              real  world - POSIX.4" autorstwa Billa O. Gallmeistera (O'Reilly
              & Associates, Inc. ISBN 1-56592-074-0).

       SUS, SUSv2
              Single Unix Specification.  (Rozwijane przez X/Open i  The  Open
              Group. Zobacz także http://www.UNIX-systems.org/version2/ .)

       4.3BSD/4.4BSD
              Dystrybucje  4.3 i 4.4 systemu Berkeley Unix. 4.4BSD jest zgodny
              w górę w stosunku do 4.3.

       V7     Version 7, potomek systemów Unix z Bell Labs.

PLIKI

       /usr/include/linux/unistd.h

ZOBACZ TAKŻE

       errno(3)

AUTORZY

       Nazwiska autorów i warunki kopiowania znajdziesz w nagłówku strony man.
       Mogą być one odmienne w zależności od strony.

       W  tłumaczeniu stron podręcznika man z pakietu man-pages, należących do
       sekcji 2, w ramach Projektu Tłumaczenia  Manuali  <http://ptm.linux.pl>
       brali udział (kolejność alfabetyczna):

              Przemek Borys <pborys@dione.ids.pl>

              Adam Byrtek <alpha@irc.pl>

              Andrzej Krzysztofowicz <ankry@mif.pg.gda.pl>

              Rafał Lewczuk <R.Lewczuk@elka.pw.edu.pl>

              Robert Luberda <robert@debian.org>