|
intro − Introducere in apelurile de sistem |
|
Acest capitol descrie apelurile de sistem Linux. Pentru a afla lista celor 164 apeluri de sistem prezente in Linux 2.0, cititi syscalls(2). |
|
Apelarea directa |
|
De obicei nu este necesara executia directa a unui apel de sistem, dar sint situatii cind biblioteca C standard nu implementeaza o executie eleganta a functiei. |
|
Sinoptica |
|
#include <linux/unistd.h> Macroul _syscall apelul de sistem dorit |
|
Setare |
|
Cel mai important lucru de stiut despre un apel de sistem este prototipul sau. Trebuie sa mai stiti citi parametrii are, tipurile lor si ce tip de rezultat intoarce. Exista sase macrouri care usureaza executia unui apel de sistem. Ele au forma: |
|
_syscallX(tip,nume,tip1,arg1,tip2,arg2,...) |
|
unde X este intre 0–5 si reprezinta numarul de argumente asteptat de apelul de sistem |
|
tip este tipul de rezultat intors de apelul de sistem |
|
nume este numele apelului de sistem |
|
tipN este tipul celui de-al N-lea argument |
|
argN este numele celui de-al N-lea argument |
|
Aceste macrouri creeaza o functie cu numele nume si cu argumentele pe care le specificati. Imediat ce includeti _syscall() in fisierul sursa, puteti executa apelul de sistem ca nume. |
#include <stdio.h>
#include <linux/unistd.h> /* pentru macroul _syscallX si altele */
#include <linux/kernel.h> /* pentru struct-ul sysinfo */
_syscall1(int, sysinfo, struct sysinfo *, info);
/* Observatie: cind copiati codul direct din sursa nroff,
nu uitati sa STERGETI barele oblice stinga suplimentare din printf-uri. */
int main(void)
{
struct sysinfo s_info;
int error;
error = sysinfo(&s_info);
printf("cod de eroare = %d\n", error);
printf("Uptime = %ds\nIncarcare: 1 min %d / 5 min %d / 15 min %d\n"
"RAM: total %d / liber %d / partajat %d\n"
"Memorie in tampoane = %d\nSwap: total %d / liber %d\n"
"Numarul de procese = %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);
}
|
cod de eroare = 0 Uptime = 502034s Incarcare: 1 min 13376 / 5 min 5504 / 15 min 1152 RAM: total 15343616 / liber 827392 / partajat 8237056 Memorie in tampoane = 5066752 Swap: total 27881472 / liber 24698880 Numarul de procese = 40 |
|
Macrourile _syscall() NU produc un prototip. S-ar putea sa fie nevoie sa creati unul, in special pentru utilizatorii de C++. Nu este obligatoriu ca apelurile de sistem sa returneze numai codurile de eroare pozitive sau negative. Trebuie sa cititi codul sursa pentru a determina modul in care vor fi returnate erorile. De obicei este valoarea negativa a unui cod de eroare standard, de exemplu −EPERM. Macrourile _syscall() vor returna rezultatul r al apelului de sistem cind r este nenegativ, dar va returna −1 si va seta variabila errno la −r cind r este negativ. Pentru lista codurilor de eroare, cititi pagina de manual errno(3). Unele apeluri de sistem precum mmap, au nevoie de mai mult de cinci argumente. O asemenea situatie cere care argumentele sa fie puse pe stiva si sa fie pasat un pointer la blocul de argumente. La definirea unui apel de sistem, tipurile argumentelor TREBUIE sa fie pasate ca valoare sau ca pointer (pentru date agregate precum struct-uri). |
|
Pentru a indica variantele de UNIX si standardele cu care se conformeaza apelurile de sistem, este utilizat un set de coduri. Acestea sint: |
|
SVr4 |
System V Release 4 Unix, asa cum este descris in "Programmer’s Reference Manual: Operating System API (Intel processors)" (Prentice-Hall 1992, ISBN 0-13-951294-2) |
||
|
SVID |
System V Interface Definition, asa cum este descris in "The System V Interface Definition, Fourth Edition". |
|
POSIX.1 |
|
IEEE 1003.1-1990 part 1, adica ISO/IEC 9945-1:1990s, adica "IEEE Portable Operating System Interface for Computing Environments", asa cum a fost elucidat in "POSIX Programmer’s Guide" de Donald Lewine (O’Reilly & Associates, Inc., 1991, ISBN 0-937175-73-0. |
|
POSIX.1b |
|
IEEE Std 1003.1b-1993 (POSIX.1b standard) descriind facilitatile de timp real pentru sistemele de operare portabile, adica ISO/IEC 9945-1:1996, asa cum a fost elucidat in "Programming for the real world − POSIX.4" de Bill O. Gallmeister (O’Reilly & Associates, Inc. ISBN 1−56592−074−0). |
|
SUS, SUSv2 |
|
Single Unix Specification. Dezvoltat de X/Open si The Open Group. Vedeti si http://www.UNIX-systems.org/version2/ |
|
4.3BSD/4.4BSD |
|
Distributia 4.3 si 4.4 de Berkeley Unix. 4.4BSD a fost compatibila de jos in sus cu 4.3. |
|
V7 |
Version 7, Unix-ul ancestral de la Bell Labs. |
|
/usr/include/linux/unistd.h |
|
errno(3) |