当前位置:  技术问答>linux和unix

setrlimit限制CPU运行时间,没有起作用,为什么?

    来源: 互联网  发布时间:2016-10-19

    本文导语:  我想用setrlimit限制CPU运行时间=3s。main程序每1s打印一个计数,当3s来临的时候,signal处理函数打印一条消息。 问题是: 程序并没有退出,而是不断的执行。signal处理函数也没有被调用。程序错在哪里? #include #include #i...

我想用setrlimit限制CPU运行时间=3s。main程序每1s打印一个计数,当3s来临的时候,signal处理函数打印一条消息。

问题是:
程序并没有退出,而是不断的执行。signal处理函数也没有被调用。程序错在哪里?


#include
#include
#include
#include
#include
#include
void f(void){
   int i=0;
   while(1){
     printf("counter:%dn",++i);
     sleep(1);
   }
}
int main(void){
  struct rlimit lim;
  lim.rlim_cur=3;
  lim.rlim_max=3;
  if(setrlimit(RLIMIT_CPU,&lim)){
    printf("setrlimit failedn");
    return 1;
  }
  f();
  return 0;
}

|

我做了一下测试,知道原因了。

根据测试来看,RLIMIT_CPU指的是进程时间,而不是挂壁时间。当调用printf()系列函数的时候,大量的时间用于等待IO完成。也就是说,进程被切换出运行队列了。因此,在使用fprintf()时,需要等待很长时间。尤其是输出的对象是一个终端。更甚的是,使用了sleep()。那要等很。。。久。

建议是,去掉sleep(),并将输出定向到一个文件。会快很多。如:

./a.out >result

我的测试是去掉了所有的IO函数,使用致密循环,如下:



/* gcc cpu_rlimit.c */
#include 
#include 
#include 
#include 
#include 
#include 
#include 

static void
err_exit(const char *msg) {
fprintf(stderr, "%s: %sn", msg, strerror(errno));
exit(-1);
}

void
sig_xcpu(int signo) {
fprintf(stdout, "sig_xcpun");
}

static void
do_something() {
int count = 0;
while (1) {
/* fprintf(stdout, "count: %dn", count++); */
/* sleep(1); */
count++;
}
}

int
main() {
struct rlimit cpu_limit = {3, 10}; /* 为了更清楚的查看SIGXCPU,SIGKILL机制,相对于 {3, 3} */

if (signal(SIGXCPU, sig_xcpu) == SIG_ERR)
err_exit("signal failed");

if (setrlimit(RLIMIT_CPU, &cpu_limit) == -1)
err_exit("setrlimit failed");

do_something();

return (0);
}


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 基于Linux系统调用--getrlimit()与setrlimit()函数的方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3