我必須制作像那些“在線評委”這樣的工具,來編譯和執行 c/cpp 代碼并回傳一些結果,但還要測量它是否超過時間限制或記憶體限制。
我發現了多個使用行程 PID 的 linux 命令,并且在啟動可執行檔案后我能夠獲取行程的 pid,但是該行程將在那些讀取記憶體使用情況的 linux 命令之前完成,因此會引發錯誤。
我也找到了 valgrind,但是完成需要太多時間。
有沒有辦法從給定的 c/cpp 檔案啟動可執行結果,并讓它在我告訴它之前不會結束,這樣我就有時間讀取它的記憶體使用情況???
一個 bash/cpp/c 解決方案 thkx。
uj5u.com熱心網友回復:
如果只關心不超過記憶體限制,那么與其讀取峰值記憶體使用量,不如將程式運行到適當的約束CGroup中更簡單。
下面的兩個選項都使用相同的底層機制(CGroups)。
假設您的程式是./a.out.
選項 1(更簡單):運行具有記憶體限制的容器
此選項需要安裝 docker。
運行到一個臨時容器(例如基于busybox):
docker run --rm -it -v $PWD/:/work -w /work --memory=64m busybox ./a.out
選項 2:創建自定義 cgroup 并在其中運行行程
cgroup-tools必須安裝此選項(在基于 Debian 的系統中,可能在其他發行版中命名不同)。
為普通用戶創建一個 cgroup(作為超級用戶)。例如,test1為資源控制器創建一個 cgroup memory。該組由用戶管理user1
(因此可以在 cgroupuser1中設定限制 ( -a) 和運行任務 ( )):-t
sudo cgcreate -a user1:user1 -t user1:user1 -g memory:test1
作為普通用戶,使用層次結構user1設定一些限制:/sys/fs/cgroup
echo 64m > /sys/fs/cgroup/memory/test1/memory.limit_in_bytes
使用以下命令在 cgroup 中運行程式cgexec:
cgexec -g memory:test1 ./a.out
uj5u.com熱心網友回復:
讓 C/C 代碼在退出之前STOP通過函式呼叫向自身發送信號。kill()這將凍結該程序。然后,您可以在腳本中執行您需要的任何操作,然后向行程發送CONT信號以解凍它。
uj5u.com熱心網友回復:
使用/usr/bin/time具有自定義輸出格式的命令,例如:
/usr/bin/time -f "***** Maximum RSS = %M kB *****" COMMAND ARGS...
最后一行輸出將是包含最大“駐留集大小”的自定義字串。但是請注意,RSS 與總記憶體不同。在這里查看解釋:維基百科
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/475424.html
