Generell glaube ich nicht, dass Sie das leider können. (Einige Betriebssysteme sehen dies möglicherweise vor, aber mir sind nicht diejenigen bekannt, von denen ich weiß, dass sie dies unterstützen.)
Referenzdokument für Ressourcenlimits: getrlimit
ab POSIX 2008.
Nehmen Sie zum Beispiel das CPU-Limit RLIMIT_CPU
.
- Wenn der Prozess das Soft-Limit überschreitet, wird a gesendet
SIGXCPU
- Wenn der Prozess das harte Limit überschreitet, wird eine Ebene angezeigt
SIGKILL
Wenn Sie wait()
in Ihrem Programm können, können Sie feststellen, ob es von getötet wurde SIGXCPU
. Aber man konnte einen SIGKILL
wegen Verletzung der harten Grenze entsandten nicht von einem einfachen alten Mord von außen unterscheiden. Was mehr ist, wenn das Programm das handhabt XCPU
, werden Sie das nicht einmal von außen sehen.
Gleiches für RLIMIT_FSIZE
. Sie können SIGXFSZ
den wait()
Status sehen, wenn das Programm ihn nicht verarbeitet. Sobald die Dateigrößenbeschränkung überschritten wird, werden nur weitere E / A-Vorgänge, die versuchen, diese Beschränkung erneut zu testen, einfach empfangen EFBIG
- dies wird vom Programm intern behandelt (oder leider nicht). Wenn das Programm SIGXFSZ
wie oben behandelt wird, wissen Sie nichts darüber.
RLIMIT_NOFILE
? Du bekommst nicht mal ein Signal. open
und Freunde kehren einfach EMFILE
zum Programm zurück. Es wird nicht anderweitig gestört, so dass es fehlschlägt (oder nicht), wie auch immer es codiert wurde, um in dieser Situation zu versagen.
RLIMIT_STACK
? Gut alt SIGSEGV
, kann nicht von der Punktzahl anderer Gründe unterschieden werden, um einen geliefert zu bekommen. (Sie werden jedoch anhand des wait
Status wissen, dass dies den Prozess beendet hat.)
RLIMIT_AS
und RLIMIT_DATA
wird nur machen malloc()
und einige andere beginnen zu scheitern (oder zu empfangen, SIGSEGV
wenn das AS-Limit erreicht wird, während versucht wird, den Stack unter Linux zu erweitern). Wenn das Programm nicht sehr gut geschrieben ist, wird es an diesem Punkt wahrscheinlich ziemlich zufällig fehlschlagen.
Kurz gesagt, im Allgemeinen unterscheiden sich die Fehler entweder nicht sichtbar von anderen Gründen für den Prozesssterben, sodass Sie nicht sicher sein können, oder sie können vollständig vom Programm aus behandelt werden. In diesem Fall entscheidet es, ob / wann / wie es weitergeht, nicht Sie von außen.
Soweit ich weiß, können Sie am besten ein bisschen Code schreiben, der Ihr Programm verzweigt, darauf wartet und:
- Überprüfen Sie den zu erkennenden Exit-Status
SIGXCPU
und SIGXFSZ
(AFAIK, diese Signale werden nur vom Betriebssystem für Probleme mit Ressourcenlimits generiert). Je nach Ihrem genauen Bedarf, können Sie davon ausgehen , dass SIGKILL
und SIGSEGV
wurden auch an Ressourcengrenzen im Zusammenhang, aber das ist ein bisschen weit hergeholt.
- Schauen Sie sich an, was Sie aus
getrusage(RUSAGE_CHILDREN,...)
Ihrer Implementierung herausholen können, um einen Hinweis auf die anderen zu erhalten.
Möglicherweise gibt es hier betriebssystemspezifische Funktionen (möglicherweise ptrace
unter Linux oder Solaris dtrace
) oder möglicherweise Techniken vom Typ Debugger, die jedoch noch stärker an Ihre spezifische Implementierung gebunden sind.
(Ich hoffe, jemand anderes wird mit einer magischen Sache antworten, von der ich nichts weiß.)
malloc
aber leider löst es das Speicherproblem im Allgemeinen nicht, weil es im Allgemeinen um Systemaufrufe gehtbrk
(habe ich recht?).