我必须做一个像那些‘在线评判’这样的工具,编译和执行c/cpp代码并返回一些结果,但也测量它是否超过了时间限制或内存限制。
我找到了多个使用进程pid的linux命令,在启动可执行文件之后,我能够获得进程的PID,但是进程在那些读取内存使用情况的linux命令之前就完成了,因此它会抛出一个错误。
我也发现了英勇,但它需要太多的时间来完成。
是否有方法从给定的c/cpp文件启动可执行结果组,并使其在我告诉它之前不结束,以便有时间读取它的内存使用情况?
bash/cpp/c溶液
发布于 2022-05-15 21:08:10
如果只关心内存限制没有超过,那么,与读取峰值内存使用情况不同,将程序运行到适当约束的CGroup中会更简单。
下面的两个选项都使用相同的底层机制(CGroups)。
假设您的程序是./a.out。
选项1(更简单):运行具有内存限制的容器
此选项需要安装码头。
进入临时容器(例如,基于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管理(因此user1可以在cgroup内设置限制(-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使用cgexec在cgroup中运行程序
cgexec -g memory:test1 ./a.out发布于 2022-05-15 21:30:50
使用带有自定义输出格式的/usr/bin/time命令,例如:
/usr/bin/time -f "***** Maximum RSS = %M kB *****" COMMAND ARGS...输出的最后一行将是包含最大“驻留集大小”的自定义字符串。但是,请注意,RSS与总内存并不相同。请查看此处以获得解释:维基百科
发布于 2022-05-15 16:02:33
让C/C++代码在C/C++退出之前发送带有STOP函数调用的kill()信号。这将冻结这一过程。然后,您可以在脚本中做您需要做的任何事情,然后将CONT信号发送给取消冻结它。
https://stackoverflow.com/questions/72248902
复制相似问题