next up previous contents
Next: 'szwajcarski wojskowy scyzoryk' - Up: The Linux Programmer's Guide Previous: Pakiet libc   Contents

Wywołania systemowe

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().


next up previous contents
Next: 'szwajcarski wojskowy scyzoryk' - Up: The Linux Programmer's Guide Previous: Pakiet libc   Contents

2000-03-01


Poltronic