Ich habe Programme in C / C ++ geschrieben, die die Linux-API nutzen und Systemaufrufe wie fork (), read (), write () usw. machen. Jetzt frage ich mich, ob diese Bibliotheksfunktionen tatsächlich funktionieren Systemaufrufe, oder sind sie eine Art Wrapper-Funktionen.
Was passiert wirklich, wenn ein Programm einen Aufruf von write () aufruft? Wie funktioniert diese Funktion mit dem Kernel? Wenn das ein Wrapper ist, warum brauchen wir es dann?
Alle diese Funktionen sind echte Benutzerraumfunktionen in libc.so
, mit denen Ihre Binärdatei verknüpft ist. Aber die meisten von ihnen sind nur kleine Wrapper für syscalls, die die Schnittstelle zwischen dem Userspace und dem Kernel sind (siehe auch syscall(2)
).
Beachten Sie, dass Funktionen, die rein Userspace sind (wie fmod(3)
) oder einige Dinge in Userspace zusätzlich zum Aufruf des Kernels (wie execl(3)
) ihre Manpages im Abschnitt 3 haben, während Funktionen, die nur den Kernel aufrufen (wie read(2)
) haben sie im Abschnitt 2.
mit diesem einfachen Code:
%Vor% Sie können strace
verwenden, um Systemaufrufe zu finden, die in der Binärdatei verwendet werden:
Das Ergebnis ist etwa so:
%Vor% wie für fork()
, es ist eigentlich ein Wrapper um clone()
system call