首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux,进程在读取它的峰值内存使用之前就结束了。

问Linux,进程在读取它的峰值内存使用之前就结束了。
EN

Stack Overflow用户
提问于 2022-05-15 13:53:41
回答 3查看 177关注 0票数 1

我必须做一个像那些‘在线评判’这样的工具,编译和执行c/cpp代码并返回一些结果,但也测量它是否超过了时间限制或内存限制。

我找到了多个使用进程pid的linux命令,在启动可执行文件之后,我能够获得进程的PID,但是进程在那些读取内存使用情况的linux命令之前就完成了,因此它会抛出一个错误。

我也发现了英勇,但它需要太多的时间来完成。

是否有方法从给定的c/cpp文件启动可执行结果组,并使其在我告诉它之前不结束,以便有时间读取它的内存使用情况?

bash/cpp/c溶液

EN

回答 3

Stack Overflow用户

发布于 2022-05-15 21:08:10

如果只关心内存限制没有超过,那么,与读取峰值内存使用情况不同,将程序运行到适当约束的CGroup中会更简单。

下面的两个选项都使用相同的底层机制(CGroups)。

假设您的程序是./a.out。

选项1(更简单):运行具有内存限制的容器

此选项需要安装码头。

进入临时容器(例如,基于busybox):

代码语言:javascript
复制
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) ):

代码语言:javascript
复制
sudo cgcreate -a user1:user1 -t user1:user1 -g memory:test1

作为普通用户,user1使用/sys/fs/cgroup层次结构设置了一些限制:

代码语言:javascript
复制
echo 64m > /sys/fs/cgroup/memory/test1/memory.limit_in_bytes

使用cgexec在cgroup中运行程序

代码语言:javascript
复制
cgexec -g memory:test1 ./a.out
票数 1
EN

Stack Overflow用户

发布于 2022-05-15 21:30:50

使用带有自定义输出格式的/usr/bin/time命令,例如:

代码语言:javascript
复制
/usr/bin/time -f "***** Maximum RSS = %M kB *****" COMMAND ARGS...

输出的最后一行将是包含最大“驻留集大小”的自定义字符串。但是,请注意,RSS与总内存并不相同。请查看此处以获得解释:维基百科

票数 1
EN

Stack Overflow用户

发布于 2022-05-15 16:02:33

让C/C++代码在C/C++退出之前发送带有STOP函数调用的kill()信号。这将冻结这一过程。然后,您可以在脚本中做您需要做的任何事情,然后将CONT信号发送给取消冻结它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72248902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档