C++11 setrlimit RLIMIT_CPU引发的SIGXCPU晚于虚拟机中的预期时间

C++11 setrlimit RLIMIT_CPU引发的SIGXCPU晚于虚拟机中的预期时间,c++11,linux-kernel,signals,virtualbox,setrlimit,C++11,Linux Kernel,Signals,Virtualbox,Setrlimit,[编辑:在文本中添加MCVE,澄清] 我有以下程序,它使用setrlimit()将RLIMIT\u CPU设置为2秒,并捕获信号限制CPU时间。«当进程达到软限制时,将发送一个SIGXCPU信号。此信号的默认操作是终止进程。但是,可以捕获信号,处理程序可以将控制权返回主程序。»() 下面的程序为SIGXCPU设置RLIMIT\u CPU和信号处理程序,然后它生成随机数,直到SIGXCPU升高,信号处理程序仅退出程序 测试信号.cpp /* *CMS上信号处理的测试程序。 * *编译时使用: */

[编辑:在文本中添加MCVE,澄清]

我有以下程序,它使用
setrlimit()
RLIMIT\u CPU
设置为2秒,并捕获信号<代码>限制CPU时间。«当进程达到软限制时,将发送一个
SIGXCPU
信号。此信号的默认操作是终止进程。但是,可以捕获信号,处理程序可以将控制权返回主程序。»()

下面的程序为
SIGXCPU
设置
RLIMIT\u CPU
和信号处理程序,然后它生成随机数,直到
SIGXCPU
升高,信号处理程序仅退出程序

测试信号.cpp

/*
*CMS上信号处理的测试程序。
*
*编译时使用:
*/usr/bin/g++[-DDEBUG]-Wall-std=c++11-O2-pipe-static-s\
*-o测试\信号测试\信号.cpp
*
*选项-DDEBUG激活helpers库中的一些调试日志记录。
*/
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
命名空间帮助程序{
长启动时间=-1;
易失性信号原子超时标志=false;
unsigned const timelimit=2;//CPU时间的软限制(秒)
无效设置信号(无效);
作废设置\时限\作废;
静态无效信号处理器(int信号);
长获取时间(无效);
bool已达到超时(无效);
作废设置(作废);
}
名称空间{
无符号常数minrand=5;
无符号常量maxrand=20;
int const numcycles=5000000;
};
/*
*非常简单的调试器,在编译时使用-DDEBUG启用。
*如果启用,它将在stderr上打印,否则它什么也不做(它不会
*甚至计算表达式的右侧)。
*
*主要思想来自:
*-C++启用/禁用STD:调试的调试消息
*     (https://stackoverflow.com/q/3371540/2377454)
*-标准无操作输出流
*     (https://stackoverflow.com/a/11826787/2377454)
*/
#ifdef调试
#定义调试为真
#否则
#定义调试错误
#恩迪夫
#如果(!debug),则定义debug_记录器\
{} \
否则\
瑟尔
/usr/bin/g++ -DDEBUG -Wall -std=c++11 -O2 -pipe -static -s -o test_signal test_signal.cpp
$ /usr/bin/time -v  ./test_signal                                                                     
[DEBUG] helpers::set_signal:    set_signal() called
[DEBUG] helpers::set_signal:    action.sa_handler: 1
[DEBUG] helpers::set_limit:     set_limit() called
[DEBUG] helpers::set_limit:     current limit: 2 seconds
i: 0    - nmsec: 11 - program has been running for 150184 microseconds
i: 1    - nmsec: 18 - program has been running for 294497 microseconds
i: 2    - nmsec: 9  - program has been running for 422220 microseconds
i: 3    - nmsec: 5  - program has been running for 551882 microseconds
i: 4    - nmsec: 20 - program has been running for 685373 microseconds
i: 5    - nmsec: 16 - program has been running for 816642 microseconds
i: 6    - nmsec: 9  - program has been running for 951208 microseconds
i: 7    - nmsec: 20 - program has been running for 1085614 microseconds
i: 8    - nmsec: 20 - program has been running for 1217199 microseconds
i: 9    - nmsec: 12 - program has been running for 1350183 microseconds
i: 10   - nmsec: 17 - program has been running for 1486431 microseconds
i: 11   - nmsec: 13 - program has been running for 1619845 microseconds
i: 12   - nmsec: 20 - program has been running for 1758074 microseconds
i: 13   - nmsec: 11 - program has been running for 1895408 microseconds
[DEBUG] helpers::signal_handler:    signal 24 received
[DEBUG] helpers::signal_handler:    exiting after 2003326 microseconds
    Command being timed: "./test_signal"
    User time (seconds): 1.99
    System time (seconds): 0.00
    Percent of CPU this job got: 99%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.01
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 1644
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 59
    Voluntary context switches: 1
    Involuntary context switches: 109
    Swaps: 0
    File system inputs: 0
    File system outputs: 16
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
$ /usr/bin/time -v  ./test_signal                                                                     
[DEBUG] helpers::set_signal:    set_signal() called
[DEBUG] helpers::set_signal:    action.sa_handler: 1
[DEBUG] helpers::set_limit:     set_limit() called
[DEBUG] helpers::set_limit:     current limit: 2 seconds
i: 0    - nmsec: 12 - program has been running for 148651 microseconds
i: 1    - nmsec: 13 - program has been running for 280494 microseconds
i: 2    - nmsec: 7  - program has been running for 428390 microseconds
i: 3    - nmsec: 5  - program has been running for 580805 microseconds
i: 4    - nmsec: 10 - program has been running for 714362 microseconds
i: 5    - nmsec: 19 - program has been running for 846853 microseconds
i: 6    - nmsec: 20 - program has been running for 981253 microseconds
i: 7    - nmsec: 7  - program has been running for 1114686 microseconds
i: 8    - nmsec: 7  - program has been running for 1249530 microseconds
i: 9    - nmsec: 12 - program has been running for 1392096 microseconds
i: 10   - nmsec: 20 - program has been running for 1531859 microseconds
i: 11   - nmsec: 19 - program has been running for 1667021 microseconds
i: 12   - nmsec: 13 - program has been running for 1818431 microseconds
i: 13   - nmsec: 17 - program has been running for 1973182 microseconds
i: 14   - nmsec: 7  - program has been running for 2115423 microseconds
i: 15   - nmsec: 20 - program has been running for 2255140 microseconds
i: 16   - nmsec: 13 - program has been running for 2394162 microseconds
i: 17   - nmsec: 10 - program has been running for 2528274 microseconds
i: 18   - nmsec: 15 - program has been running for 2667978 microseconds
i: 19   - nmsec: 8  - program has been running for 2803725 microseconds
i: 20   - nmsec: 9  - program has been running for 2940610 microseconds
i: 21   - nmsec: 19 - program has been running for 3075349 microseconds
i: 22   - nmsec: 14 - program has been running for 3215255 microseconds
i: 23   - nmsec: 5  - program has been running for 3356515 microseconds
i: 24   - nmsec: 5  - program has been running for 3497369 microseconds
[DEBUG] helpers::signal_handler:    signal 24 received
[DEBUG] helpers::signal_handler:    exiting after 3503271 microseconds
    Command being timed: "./test_signal"
    User time (seconds): 3.50
    System time (seconds): 0.00
    Percent of CPU this job got: 99%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.52
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 1636
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 59
    Voluntary context switches: 0
    Involuntary context switches: 106
    Swaps: 0
    File system inputs: 0
    File system outputs: 16
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0