一般的に言えば、残念ながらそうはならないでしょう。(一部のオペレーティングシステムはそれを提供する場合がありますが、これをサポートしていることがわかっているオペレーティングシステムについては知りません。)
リソース制限のリファレンスドキュメント:getrlimit
POSIX 2008以降。
CPU制限を例にとりますRLIMIT_CPU
。
- プロセスがソフト制限を超えると、プロセスが送信されます
SIGXCPU
- プロセスがハード制限を超えると、明白になります
SIGKILL
あなたができる場合はwait()
、あなたのプログラムにそれが殺された場合、あなたは言うことができますSIGXCPU
。しかしSIGKILL
、ハードリミットの違反で派遣された派遣を、外部からの単純な古い殺害と区別することはできません。さらに、プログラムがを処理する場合、XCPU
外部からそれを見ることもできません。
同じことRLIMIT_FSIZE
。プログラムが処理しない場合はSIGXFSZ
、wait()
ステータスから確認できます。ただし、ファイルサイズの制限を超えると、唯一発生するのは、その制限を再度テストしようとするI / Oが単に受信するだけです。EFBIG
これは、プログラムによって内部的に処理されます(または、残念ながら処理されません)。プログラムがを処理する場合、SIGXFSZ
上記と同じ-それについてはわかりません。
RLIMIT_NOFILE
?まあ、あなたは信号を得ることすらありません。open
友達EMFILE
はプログラムに戻るだけです。それ以外の場合は問題ありません。そのため、その状況で失敗するようにコーディングされた方法で失敗します(または失敗しません)。
RLIMIT_STACK
?古き良きSIGSEGV
、配信される他の理由のスコアと区別できません。(それがwait
ステータスから、それがプロセスを殺したものだったことがわかるでしょう。)
RLIMIT_AS
そして、RLIMIT_DATA
ばかりになりますmalloc()
と、いくつか他の人が失敗を開始(または受信SIGSEGV
Linux上でスタックを拡張しようとしたときに、ASの制限がヒットした場合)。プログラムが非常によく書かれていない限り、おそらくその時点でかなりランダムに失敗するでしょう。
つまり、簡単に言えば、一般的に、失敗は他のプロセスの死の理由と視覚的に異なるわけではないため、確信が持てないか、プログラムから完全に処理することができます。外部から。
私が知る限り、あなたができる最善のことは、プログラムを分岐して待機する少しのコードを書くことです。
- 検出する終了ステータスをチェック
SIGXCPU
し、SIGXFSZ
(私の知る限り、これらの信号のみがリソース制限の問題のためにOSによって生成されます)。正確なニーズによっては、リソースの制限に関連しているSIGKILL
と想定することSIGSEGV
もできますが、それは少しストレッチです。
getrusage(RUSAGE_CHILDREN,...)
他の実装についてのヒントを得るために、実装から何を得ることができるかを見てください。
ここで役立つOS固有の機能(おそらくptrace
LinuxやSolarisのようなものdtrace
)、またはおそらくデバッガータイプの手法が存在する可能性がありますが、それは特定の実装にさらに結びつくことになります。
(私が完全に気付いていない魔法のことで他の誰かが答えてくれることを願っています。)
malloc
が、残念ながらそれは一般的にメモリの問題を解決しません、それは一般的にシステムコールに関するものですbrk
(私は正しいですか?)。