He estado escribiendo programas en C/C++ que hacen uso de la API de Linux y realizan llamadas al sistema como fork(), read(), write(), etc. Ahora, empiezo a preguntarme si estas funciones de biblioteca son en realidad llamadas al sistema. o son algún tipo de funciones de envoltura.
¿Qué sucede realmente cuando un programa hace una llamada a write() ? ¿Cómo interactúa esta función con el núcleo? Si esto es un envoltorio, ¿por qué lo necesitamos?
Todas estas funciones son funciones de espacio de usuario reales en libc.so para que su binario esté vinculado. Pero la mayoría de ellos son solo pequeños envoltorios para syscalls que son la interfaz entre el espacio de usuario y el kernel (ver también syscall(2) ).
Tenga en cuenta que las funciones que son puramente espacio de usuario (como fmod(3) ) o hacen algunas cosas en el espacio de usuario además de llamar al kernel (como execl(3) ) tienen sus páginas de manual en la sección 3, mientras que las funciones que solo llaman al kernel (como read(2) ) las tienen en el apartado 2.
usando este sencillo código:
int main() { int f = open("/tmp/test.txt", O_CREAT | O_RDWR, 0666); write(f, "hello world", 11); close(f); return 0; } puede usar strace para encontrar llamadas al sistema utilizadas en el archivo binario:
gcc test.c -o test strace ./testel resultado es algo como esto:
. . . open("/tmp/test.txt", O_RDWR|O_CREAT, 0666) = 3 write(3, "hello world", 11) = 11 close(3) = 0 exit_group(0) = ? en cuanto a fork() , en realidad es un envoltorio alrededor de la llamada al sistema clone()