我有这段代码:
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)
答案 0 :(得分:1)
手册页setrlimit(2)
声明:
CPU时间限制,以秒为单位。当过程达到软 限制,它发送一个SIGXCPU信号。此默认操作 信号是终止进程。但是,信号可以 捕获,处理程序可以将控制权返回给主程序。
可能您没有收到任何输出,因为您的输出流未刷新(输出std::endl
来解决此问题)。程序可以在信号刷新其输出缓冲区之前被信号杀死。也可能是缓冲区首先不会存在execl()
。
更多建议:
然后你应该实现所述信号处理程序,你的程序将 从那里继续实现它以查看信号是否 捕获。
请注意,您还需要针对该案例的后备解决方案 在CPU时间结束之前,该过程意外终止。
另请注意,如果我正确使用,您还需要考虑 设置限制时进程已经使用的CPU时间。