2016-02-28 12 views
8

Ho scritto programmi in C/C++ che fanno uso dell'API di Linux e faccio chiamate di sistema come fork(), read(), write() ecc. Ora sto cominciando a chiedermi se queste funzioni di libreria sono in realtà un sistema chiama o sono una specie di funzione wrapper.Sono chiamate di funzione come read(), write() chiamate di sistema effettive in linux?

Cosa succede veramente quando un programma effettua una chiamata a write()? In che modo questa funzione interagisce con il kernel? Se questo è un wrapper allora perché ne abbiamo bisogno?

+1

Come sulla lettura Assenbly codice che il compilatore emette o utilizzando un debugger per tracciare quello il tuo programma funziona? – MikeCAT

+2

Un modo rapido per scoprire quali chiamate sono semplici involucri di chiamata di sistema è di solito l'uso di 'man'. La sezione 2 contiene le chiamate di sistema in modo che "man 2 read'" sia un'indicazione che leggere effettivamente è una chiamata di sistema avvolta. –

risposta

6

Tutte queste funzioni sono vere funzioni dello spazio utente in libc.so a cui è collegato il binario. Ma la maggior parte di questi sono solo dei piccoli wrapper per i syscalls che sono l'interfaccia tra lo spazio utente e il kernel (vedi anche syscall(2)).

Nota che le funzioni che sono puramente userspace (come fmod(3)) o fare alcune cose in userspace oltre a chiamare il kernel (come execl(3)) hanno le loro pagine di manuale nella sezione 3, mentre le funzioni che basta chiamare il kernel (come read(2)) hanno li nella sezione 2.

+0

È il contrario. Le funzioni che sono wrapper puri sono nella sezione 2. La sezione 3 è o il resto. Vedi per es. execl (3) ed execve (2). – a3f

+0

@ a3f Questo è quello che ha detto. System wrappers di sistema nella sezione 2, pura funzione user-space nella sezione 3. – EJP

+2

@EJP Qualcuno potrebbe pensare che le voci nella sezione 3 non chiamino il kernel. Come altrimenti dovrebbero essere nella sezione 2, perché la risposta attualmente afferma "funzioni che chiamano il kernel averle nella sezione 2". – a3f

1

utilizzando questo semplice codice:

int main() 
{ 
    int f = open("/tmp/test.txt", O_CREAT | O_RDWR, 0666); 
    write(f, "hello world", 11); 
    close(f); 

    return 0; 
} 

è possibile utilizzare per trovare strace chiamate di sistema utilizzati nel file binario:

gcc test.c -o test 
strace ./test 

il risultato è qualcosa di simile:

. 
. 
. 
open("/tmp/test.txt", O_RDWR|O_CREAT, 0666) = 3 
write(3, "hello world", 11)    = 11 
close(3)        = 0 
exit_group(0)       = ? 

come per fork(), in realtà è un wrapper chiamata di sistema clone()

Problemi correlati