gpt4 book ai didi

c - 来自信号处理程序的 longjmp()

转载 作者:太空狗 更新时间:2023-10-29 14:53:44 27 4
gpt4 key购买 nike

我正在使用以下代码尝试读取来自用户的输入,如果超过 5 秒则超时并退出。这是通过 setjmp/longjmp 和 SIGALRM 信号的组合来实现的。

代码如下:

#include <stdio.h>
#include <setjmp.h>
#include <unistd.h>
#include <string.h>
#include <sys/signal.h>

jmp_buf buffer;

// this will cause t_gets() to return -2
void timeout() {
longjmp(buffer, 1);
}

int t_gets(char* s, int t)
{
char* ret;
signal(SIGALRM, timeout);
if (setjmp(buffer) != 0)
return -2; // <--- timeout() will jump here
alarm(t);
// if fgets() does not return in t seconds, SIGALARM handler timeout()
// will be called, causing t_gets() to return -2
ret = fgets(s, 100, stdin);
alarm(0);
if (ret == NULL ) return -1;
return strlen(s);
}

int main()
{
char s[100];
int z=t_gets(s, 5);
printf("%d\n", z);
}

现在,我的问题是这个函数是否有任何可能出错的地方。我读过从信号处理程序调用 longjmp() 可能会有未定义的行为,它到底指的是什么?

此外,如果在 fgets() 返回之后但在调用 alarm(0) 之前立即触发警报怎么办?即使用户确实输入了某些内容,它是否会导致函数返回 -2?

后期编辑:我对改进代码的方法不感兴趣。我只想知道它可能会如何失败。

最佳答案

来自 longjmp 的手册页:

POSIX does not specify whether longjmp() will restore the signal context. If you want to save and restore signal masks, use siglongjmp()

你的第二个问题:是的,该函数将返回 -2,因为 longjmp() 会导致它转到 setjmp(buffer) 部分,但时间会必须非常精确。

关于c - 来自信号处理程序的 longjmp(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1715413/

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