Wywołanie systemowe jest zazwyczaj pro¶b± do systemu operacyjnego (j±dra) aby została wykonana operacja zależna od sprzętu/systemu lub uprzywilejowana. Dla Linuxa 1.2 zadeklarowanych zostało 140 wywołań systemowych. Wywołania takie jak close() zaimplementowane s± w libc Linuxa. Taka implementacja często wymaga wywołania makra, które odwołuje się do syscall(). Parametry przekazywane do syscall() to numer wywołania oraz potrzebne argumenty. Aktualne numery wywołania można znaleĽć w <linux/unistd.h> podczas gdy <sys/syscall.h> jest aktualizowany wraz z now± libc. Jeżeli pojawiaj± się nowe wywołania systemowe, które nie s± zostały jeszcze zawarte w libc, możesz użyć syscall(). Dla przykładu: aby zamkn±ć plik można użyć syscall() w ten sposób (nie zalecane):
#include <syscall.h>
extern int syscall(int, ...);
int my_close(int filedescriptor)
{
return syscall(SYS_close, deskryptor_pliku);
}
Na platformie i386 wywołania systemowe maj± ograniczon± do 5, oprócz numeru wywołania, liczbę argumentów - ze względu na liczbę rejestrów sprzętowych. Jeżeli używasz Linuxa na innej platformie sprawdĽ w <asm/unistd.h> makro _syscall aby poznać ile argumentów wspomaga twój sprzęt lub ile zostało zdefiniowanych do użycia przez twórców. Makra _syscall mog± być używane zamiast syscall(), jednakże nie jest to zalecane ponieważ takie makro zostanie rozwinięte do funkcji która może już być zdefiniowana w bibliotece. Dlatego tylko specjali¶ci (kernel hackers) powinni bawić się z makrami _syscall. Dla przykładu: oto close() w postaci makra _syscall.
#include <linux/unistd.h> _syscall1(int, close, int, deskryptor_pliku);Makro _syscall1 rozwija się do postaci funkcji close(). Tak więc mamy close() podwójnie - raz w libc i raz w naszym programie. Syscall() lub makro _syscall zwracaj± -1 jeżeli wywołanie nie powiodło się oraz 0 lub więcej jeżeli udało się. Jeżeli chcesz wiedzieć co dokładnie zawiodło sprawdĽ warto¶ć zmiennej errno.
Następuj±ce wywołania, które s± zdefiniowane w BSD lub SYS V s± niedostępne w Linuksie:
audit(), auditon(), auditsvc(), fchroot(),
getauid(), getdents(), getmsg(), mincore(), poll(), putmsg(),
setaudit(), setauid().