intro

Autres langues

Langue: pl

Autres versions - même langue

Version: 1996-05-22 (fedora - 25/11/07)

Section: 2 (Appels système)

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>