gpt4 book ai didi

c - SIGALRM 中断系统调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:12 27 4
gpt4 key购买 nike

我需要在超时后中断系统调用(在本例中为 recvfrom)。为此,我正在使用 alarm(),但是生成的 SIGALRM 会终止我的进程,而不仅仅是中断系统调用。

我已经尝试调用 signal(SIGALRM, SIG_IGN) 来处理 SIGALRM,但这会导致系统调用根本不会被中断!我让它工作的唯一方法是创建一个自定义的空处理程序 (signal(SIGALRM, alrm_handler)) - 该处理程序什么都不做,但它仍然会导致 recvfrom 被中断而进程没有被杀死。

我知道默认信号处理程序 (SIG_DFL) 会终止进程,但我希望 SIG_IGN 忽略信号但仍会中断系统调用。我 strace 使用 SIG_IGN 和自定义空处理程序创建了一个测试程序,它们最终都在没有 SA_RESTART 的情况下调用了 rt_sigaction(SIGALRM...)。据我所知,如果设置了 SA_RESTART 系统调用将自动重启,但无论如何 SIG_IGN 都会发生这种情况!

有没有更简洁的方法可以在不需要自定义信号处理程序的情况下使用 SIGALRM 中断系统调用?

最佳答案

当您告诉操作系统忽略一个信号时,如果它在发出信号时什么都不做并忽略它,您不应该感到惊讶。 POSIX 只允许 recvfrom 在被中断时返回 EINTR,并且只有在调用信号处理程序时才会被中断。当设置 SIG_IGNPOSIX requires “信号的传递不会对过程产生影响。”

在套接字操作上设置超时的更好方法是使用 setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, ...) 在套接字上设置超时。如果超时,您将收到 EAGAINEWOULDBLOCK 错误。

您可能还想查看 select,它可能会消除使用超时的需要。

关于c - SIGALRM 中断系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25127599/

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