Tut fprintf verwenden Sie malloc() unter der Haube?
Ich soll eine minimale a-damn-malloc-nur-handler failed, schreibt einige Informationen in eine Datei (wahrscheinlich nur standard-Fehler). Ich würde es vorziehen, zu verwenden, fprintf() eher als schreiben(), aber dies wird nicht schlecht, wenn fprintf() selbst versucht malloc().
Gibt es eine Garantie, entweder in die C-standard, oder auch nur in der glibc, dass fprintf wird das nicht mehr tun?
WICHTIG!!!!!! In der HANDLER malloc Dinge, sicher zu bleiben, mit etwas, das Sie tun sollten: a) re-registrieren malloc-Handler (alle 4) standard b) machen Sie Ihre Sachen über die Protokollierung etc. c) die wirkliche Erinnerung, re/de/Zuteilung der Bedarf des Anrufers usw. d) die Wiederherstellung IHRER Handler-e), dann weiter, gut, mit exitting. Dies hat den Vorteil, dass Sie immer noch tun, was müssen Sie während der Bearbeitung und müssen sich keine Gedanken darüber, ob jeder von Ihnen ist mit malloc oder nicht. Ich habe Sie einmal gewesen, es zu tun. Datei ist zu langsam, ich war mit einem socket. 🙂
Nur zur Klarstellung, ich habe nicht wirklich registriert malloc-Handler. Ich habe einfach einige low-level-Funktionen, die Aufruf
Ah! Erstens, wie sind Sie in der Lage, um das Programm fortzusetzen, wenn
Das ist die genaue motivation meiner Frage: ich möchte zuverlässig erhalten eine Nachricht, bevor Sie verschwinden. Ich wollte wissen, ob ich verwenden könnte
So, Sie sollten sich auf das Schlimmste vorzubereiten - das ist
Nur zur Klarstellung, ich habe nicht wirklich registriert malloc-Handler. Ich habe einfach einige low-level-Funktionen, die Aufruf
malloc()
, wenn die Allokation fehlschlägt, möchte ich, dass die Funktion zum drucken eines log-Meldung.Ah! Erstens, wie sind Sie in der Lage, um das Programm fortzusetzen, wenn
malloc()
gescheitert? Ich denke, der einzige Weg für Sie, um fortzufahren drucken Sie eine vordefinierte Nachricht in einen text und senden Sie es mit write()
. In der Regel, Zuordnungsfehler in der heutigen software sind eher die Qualifikation als "call abort()
auf allocation failure". Wenn dies ist für die Fehlersuche/Diagnose, der coredump wird Ihnen sagen, viel mehr als jede Fehlermeldung (es sei denn, Sie haben abgerissen, der Stapel, natürlich).Das ist die genaue motivation meiner Frage: ich möchte zuverlässig erhalten eine Nachricht, bevor Sie verschwinden. Ich wollte wissen, ob ich verwenden könnte
printf()
für, dass, egal ob ich stick mit write()
.So, Sie sollten sich auf das Schlimmste vorzubereiten - das ist
printf()
ist wahrscheinlich rufen malloc().InformationsquelleAutor Adrian Ratnapala | 2011-07-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, es gibt keine Garantie, dass es nicht. Jedoch, die meisten Implementierungen, die ich gesehen habe eher auf eine Feste Größe der Puffer für die Erstellung der formatierten Ausgabe-string (a).
In Bezug auf die glibc (Quelle hier), es sind Aufrufe
malloc
innerhalbstdio-common/vfprintf.c
, die eine Menge von derprintf
Familie am unteren Ende, so würde ich nicht auf ihn verlassen, wenn ich du wäre. Auch die string-buffer output-Aufrufe, wiesprintf
, die Sie vielleicht denken, würde nicht benötigen, scheinen zu beheben, nach unten zu rufen, nach dem einrichten einige kniffligeFILE
-wie string-Griffe - siehelibio/iovsprintf.c
.Mein Rat ist, um dann Ihren eigenen code schreiben, damit der Ausgang, um so zu gewährleisten, dass keine Speicherzuordnungen sind getan unter der Haube (und hoffe natürlich, dass
write
selbst nicht tun (unlikelier als*printf
es zu tun)). Da bist du wahrscheinlich nicht zu viel ausgeben umgewandelt-Zeug sowieso (wahrscheinlich nur"Dang, I done run outta memory!"
), die Notwendigkeit für die formatierte Ausgabe soll ja eh fraglich.(a) Der C99-ökologischen Erwägungen gibt einen Hinweis darauf, dass (mindestens) einige frühe Implementierungen hatte eine Pufferung Grenze. Aus meiner Erinnerung von der Turbo-C-Sachen, ich dachte 4K war, über die Grenze, und in der Tat, C99-Staaten (in
7.19.6.1 fprintf
):(das Mandat für C89 war zu kodifizieren die bestehende Praxis, keine neue Sprache, und das ist ein Grund, warum einige dieser minimal maxima wurden in das standard - Sie wurden vorgetragen, um spätere Iterationen der standard).
"Die meisten Implementierungen, die ich gesehen habe eher auf eine Feste Größe der Puffer für die Erstellung der formatierten Ausgabe-string" - man fragt sich, warum. Es gibt absolut keine Notwendigkeit für die Verwendung eines Puffers (andere als die der stream-Datei selbst), in jedem der
printf()
Funktionen. (Ich habe es getan ohne, also weiß ich, wovon ich Rede.) Aber der Hinweis, dass man nicht viel braucht Umrechnung hier ist ein guter: Überprüfen Sie, obputs()
funktioniert der trick für Sie.Sie müssen in der Regel etwas Art-Puffer, wie für den ausbau von ints und floats zu Ihrem Charakter-Darstellung. Es muss nicht groß sein, und es kann verwendet werden, Stück für Stück, einmal pro %-Punkt, anstatt einmal für die gesamte Ausgabe (die müssten einen größeren Puffer). Die ökologischen Grenzen C99 gibt an, dass es Implementierungen, musste berücksichtigt werden - siehe update.
Nicht unbedingt. Ich umgesetzt
printf()
mit Rekursion, ohne Puffer.Ich sehe nicht, wie sich zu setzen, ein 20 Zeichen breites Stück auf den Stapel. Ich sage nicht, dass deine Lösung ist schlecht. Ich sage nur, es ist ein Puffer, der zu sein verwendet irgendwo. Rekursion nicht machen, die gehen Weg, es macht es nur heimtückischer.
InformationsquelleAutor paxdiablo
C-standard garantiert nicht, dass
fprintf
nicht nennenmalloc
unter der Haube. In der Tat, es nicht garantieren, dass alles, was passiert, wenn Sie überschreibenmalloc
. Lesen Sie die Dokumentation für Ihre spezielle C-Bibliothek, oder schreiben Sie einfach Ihre eigenenfprintf
-like-Funktion, die direkten Aufrufe, die Vermeidung jeder Möglichkeit von heap-allocation.InformationsquelleAutor bdonlan
Die nur funktioniert, können Sie relativ sicher sein nicht nennen
malloc
sind auch als solche gekennzeichnet async-signal-safe von POSIX. Damalloc
ist nicht erforderlich, zu async-signal-safe (und da ist es im wesentlichen unmöglich zu machen, async-signal-safe, ohne dass es unusably ineffizient), async-signal-safe-Funktionen, die normalerweise nicht nennen.Mit dieser sagte, ich bin fast sicher, dass glibc ist
printf
Funktionen (einschließlichfprintf
und sogarsnprintf
) kann und wirdmalloc
für einige (alle?) format-strings.Ja, aber das überschreiben/Verpackung
malloc
ist immer illegal (UB), natürlich... 🙂Natürlich. Nur so kleinlich bin hier 🙂
R - was meinst du einwickeln malloc ist illegal? Vielleicht meinst du das "Verpacken" malloc in einer anderen Funktion namens malloc". Durch die Verpackung, denke ich, eine neue Funktion zurückgibt, die malloc 'ed ()" - Speicher, bietet einige andere Funktionen auch.
InformationsquelleAutor R..