gpt4 book ai didi

c - 使用带或不带 sigsetjmp 的 sigaction

转载 作者:行者123 更新时间:2023-11-30 15:14:01 24 4
gpt4 key购买 nike

我有一个练习,我必须实现一个函数,该函数将单参数函数指针fun作为参数,该指针是指向该指针parameter指向的函数的参数code> 和一个整数句点。如果 fun 指向的以 parameter 作为参数的函数的执行在 period 秒之前终止,则该函数将返回 1,否则返回 0 .

这两种解决方案等效吗?

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;
}

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

最佳答案

这些不一样。

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

此外,您这里还有一个错误:

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

您缺少 ifelse block 周围的大括号,并且缺少第一个 return 之后的 ; >。另外,我相信您根据对函数应执行的操作的描述混合了返回值。

固定代码:

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

关于c - 使用带或不带 sigsetjmp 的 sigaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34208949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com