私はUbuntuでCで一種の「サンドボックス」を実行しています。プログラムを受け取り、ユーザーの下で安全に実行しますnobody
(そして信号などを傍受します)。また、メモリと時間制限を割り当て、時間とメモリ使用量を測定します。
(興味がある方のために説明すると、これは一種の「オンライン審査員」がテスト データにプログラムをマークするためのものです)
現在、 mooshak のsafeexecモジュールを採用しています。ほとんどの機能は正常に動作しますが、メモリ使用量に問題があるようです。(かなり不正確です)
ここでアドバイスを試し、VM を から解析/proc/pid/stat
したところ、精度の問題は修正されました。ただし、非常に迅速に終了するプログラムの場合は機能せず、0 が返されます。
safeexecプログラムは次のように動作するようです:
- それ
fork()
は execv()
子プロセスで使用して、目的のプログラムを実行します- 子プロセスが終了するまで、親プロセスからプログラムを監視します ( を使用する
wait4
と、たまたま CPU 使用率が返されますが、メモリは返されませんか?)そのため、子プロセスを
解析し/proc/../stat
ます (execv に置き換えられました)
では、なぜ VM in/proc/child_pid/stat
が 0 になることがあるのでしょうか?
execv() があまりにも早く終了し、/proc/child_pid/stat
利用できないためですか?
もしそうなら、子供のメモリ使用量を取得する他の方法はありますか?
(これは制限時間内でプログラムを判断するためのものなので、valgrind のようにパフォーマンスが低下するものは許せません)
前もって感謝します。