0

我有一个练习,我必须实现一个函数,该函数将一个参数函数指针fun、一个由所述指针指向的函数的参数parameter和一个整数作为参数period。如果函数的执行fun指向 with parameteras 参数在几秒之前终止,则此函数将返回 1,否则返回period0。

这两种解决方案是否等效?

static struct sigaction sa, old;
static jmp_buf env;

static void myalarm(int sig)
{
  printf("alarm!\n");
  siglongjmp(env,1);
}

int execution_time_limit( void (*fun)(void *), void *parameter, int period)
{
  sa.sa_handler = myalarm;
  sa.sa_flags = 0; 
  sigemptyset(&sa.sa_mask);
  sigaction(SIGALRM, &sa, &old);

  alarm(period);
  if(sigsetjmp(env,1) == 0) {
    fun(parameter);
    sigaction(SIGALRM, &old, NULL);
  }
  else
    return 0;
 return 1;
}

和:

static struct sigaction sa, old;
static jmp_buf env;
int ret = 0;

static void myalarm(int sig)
{
  printf("alarm!\n");
  ret = 1;
}

int execution_time_limit( void (*fun)(void *), void *parameter, int period)
{
  sa.sa_handler = myalarm;
  sa.sa_flags = 0; 
  sigemptyset(&sa.sa_mask);
  sigaction(SIGALRM, &sa, &old);

  alarm(period);
  fun(parameter);
  sigaction(SIGALRM, &old, NULL);
  return ret;
}

我会说是的,但我想澄清我可能有的任何疑问。

4

1 回答 1

1

这些不一样。

在第一个示例中,如果触发了警报,fun由于调用siglongjmp. 在第二个示例中,警报将为返回值设置标志,但fun将继续运行直至完成。

另外,您这里有一个错误:

  if(sigsetjmp(env,1) == 0) 
    fun(parameter);
    sigaction(SIGALRM, &old, NULL);
  else
    return 0
  return 1;

您在ifandelse块周围缺少大括号,并且;在第一个return. 此外,我相信您根据您对函数应该做什么的描述混淆了返回值。

固定代码:

  if(sigsetjmp(env,1) == 0) {
    fun(parameter);
    sigaction(SIGALRM, &old, NULL);
  } else {
    return 1;
  }
  return 0;
于 2015-12-10T18:52:32.697 回答