我需要测量处理异常和调用信号处理程序100000次所需的时间我需要使用signal()
系统调用为SIGFPE
注册一个处理函数,然后我需要导致除以0错误。
我现在只有一个骨架,不知道该如何处理这个信号到目前为止,我计划先调用gettimeofday()
然后进入for循环100k次来调用signal()
然后再调用另一个gettimeofday()
,以结束时间,然后获取总的运行时间,并在这些100k次调用中取其平均值。
#include <signal.h>
#include <sys/time.h>
void handle_sigfe(int signum)
{
//unsure how to handle the signal to keep the loop running for 100k times
}
double time_in_milli (struct timeval t){ //for time conversion
return (((t.tv_sec*1000000+t.tv_usec)*1000)/1000000);
}
int main(int argv, char ** argv)
{
int x =5;
int y = 0;
int z = 0;
signal(SIGFPE, handle_sigfpe);
z = x/y;
return 0;
}
有人知道我需要如何处理这个信号吗我完全迷路了
最佳答案
被零除的异常调用您安装的处理程序当处理程序返回时,处理器返回到除法指令并重试结果是一个无限循环为了防止这种情况,您可以使用sigsetjmp
和siglongjmp
例程。
当您调用sigsetjmp
时,它返回0但是,当调用siglongjmp
时,程序的行为就好像sigsetjmp
返回siglongjmp
提供的值一样因此,可以使用if
语句执行除法,或者根据sigsetjmp
的返回值跳过除法。
如果这太混乱了,希望下面的例子能澄清问题。
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
static sig_atomic_t caught = 33;
static sigjmp_buf env;
void action( int unused )
{
caught = 42;
siglongjmp( env, 1 );
}
int main( void )
{
if ( signal( SIGFPE, action ) == SIG_ERR ) {
perror( "signal failed" );
return 1;
}
int x = 1;
int y = 0;
int z;
if ( sigsetjmp( env, 1 ) == 0 )
z = x / y;
printf( "%d\n", caught );
}
全局变量
caught
用于指示捕获到异常初始值是33信号处理器将其设置为42程序末尾的printf
显示最终值它应该打印42以指示该信号被捕获。全局变量
env
由sigsetjmp
和siglongjmp
函数用于保存寄存器和堆栈的副本。if (sigsetjmp(env,1) == 0)
最初将为true,并尝试进行除法但当调用处理程序时,siglongjmp
将使程序的行为类似于sigsetjmp
返回的1
,并且将跳过除法。这允许程序越过分区,并在最后执行
printf
。关于c - 测量信号时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39671029/