Para a maioria das chamadas do sistema com páginas man na seção 2, as páginas man realmente descrevem os wrappers da biblioteca C. As exceções são geralmente mencionadas explicitamente, como gettid
que @Sergei Kurenkov se refere em sua resposta:
NOTES Glibc does not provide a wrapper for this system call; call it using syscall(2).
Da mesma forma, com pivot_root
(que não é útil para aplicativos gerais), tgkill
(que executa a função de baixo nível de pthread_kill
). Depois, há readdir
, em que a chamada real do sistema é um pouco diferente da função de biblioteca :
DESCRIPTION This is not the function you are interested in. Look at readdir(3) for the POSIX conforming C library interface. This page documents the bare kernel system call interface, which is superseded by getdents(2).
Note que tem que haver algum tipo de wrapper. Chamadas de função são feitas usando as convenções de chamada C, que é diferente da convenção de chamada da interface do kernel. Chamadas de função usuais são feitas com a instrução call
assembly (ou similar), chamadas de kernel com syscall
ou int 0x80
(e isso não está contando coisas como gettimeofday
ou getpid
no vdso
). O compilador não (precisa) saber quais chamadas de função mapeiam para uma chamada de kernel real.
Mesmo com as chamadas de sistema "usuais", o wrapper da biblioteca C atua de forma ligeiramente diferente da chamada do sistema: as chamadas do sistema retornam os códigos de erro como valores negativos variáveis (se você observar o código do kernel, verá muitos retornos como return -EPERM;
). O wrapper da biblioteca C transforma todos esses valores de retorno em -1 e move o código de erro real para errno
.