gpt4 book ai didi

C++限制CPU处理时间

转载 作者:太空狗 更新时间:2023-10-29 23:08:23 26 4
gpt4 key购买 nike

我有这个代码:

pid_t vPid=fork(); 
int vStat;
switch(vPid){
case -1: perror("fork");
exit(1);
case 0:
//proces fiu
if(chdir("/var/code/p1")==0){
system("make clean");
system("make");
//limit on data
struct rlimit vLimD;
vLimD.rlim_cur = 10000000;//10Mb
vLimD.rlim_max = 10000000; //10Mb
setrlimit(RLIMIT_DATA, &vLimD);
//limit on cpu time
struct rlimit vLimCPU;
vLimCPU.rlim_cur = 10;//10 sec
vLimCPU.rlim_max = 10;//10 sec
cout<<"limits return "<<setrlimit(RLIMIT_CPU, &vLimCPU);
execl("/var/code/p1/p1","",NULL);
}
else {exit(1);}
break;
default:
while(wait(&vStat)!=vPid);
break;
}

进程/var/code/p1/p1 运行了 40 秒,我想用 vLimitCPU(setrlimit) 限制这个进程只运行 10 秒,然后在 10 秒后做一些事情, 但不会像“限制返回值”那样打印任何内容(第一个 setrlimit 返回 0)

最佳答案

手册页 setrlimit(2) 指出:

CPU time limit in seconds. When the process reaches the soft limit, it is sent a SIGXCPU signal. The default action for this signal is to terminate the process. However, the signal can be caught, and the handler can return control to the main program.

可能您没有收到任何输出,因为您的输出流未刷新(输出std::endl 以解决此问题)。程序可能会在刷新其输出缓冲区之前被信号杀死。也可能是缓冲区首先无法在 execl() 中存活下来。

一些建议:

  • 然后你应该实现所述信号处理程序,你的程序将从那里继续。执行一下看信号是否正常捕获了。

  • 请注意,对于以下情况,您还需要一个后备解决方案进程在 CPU 时间用完之前意外终止。

  • 另请注意,如果我没看错,您还需要考虑设置限制时您的进程已经使用的 CPU 时间。

关于C++限制CPU处理时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9861473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com