Werfen Sie einen Blick auf the specification for brk/sbrk.
Der Aufruf fordert das Betriebssystem grundsätzlich auf, mehr Speicher für die Anwendung zuzuweisen, indem der vorherige "Unterbrechungswert" um einen bestimmten Betrag erhöht wird. Dieser Betrag (der erste Parameter) ist die Menge an zusätzlichem Speicher, die Ihre Anwendung erhält.
Die meisten rudimentären malloc-Implementierungen bauen auf dem sbrk-Systemaufruf auf, um Speicherblöcke zu erhalten, die sie aufteilen und verfolgen. Die mmap Funktion wird allgemein als eine bessere Wahl akzeptiert (weshalb mallocs wie dlmalloc beide mit einem #ifdef unterstützen).
Wie bei „wie es funktioniert“, ein sbrk an seinem einfachsten Ebene wie folgt aussehen könnte:
uintptr_t current_break; // Some global variable for your application.
// This would probably be properly tracked by the OS for the process
void *sbrk(intptr_t incr)
{
uintptr_t old_break = current_break;
current_break += incr;
return (void*) old_break;
}
Moderne Betriebssysteme würden weit mehr, wie Kartenseiten in den Adressraum tun und Hinzufügen von Verfolgungsinformationen für jeden zugewiesenen Speicherblock.
Beachten Sie, dass die Funktionen in der Referenz mit "LEGACY" gekennzeichnet sind; Wenn Sie zu der aktuellen SUS-Spezifikation gehen (http://www.opengroup.org/onlinepubs/9699919799/toc.htm), sind sie (brk, sbrk) nicht vorhanden. –
Guter Punkt - die Verwendung solcher Funktionen kann zu Portabilitätsproblemen führen, wenn eine Implementierung beschließt, sich nicht um die Abwärtskompatibilität zu kümmern. –