考虑这个程序:
#include <stdio.h>
#include <sys/epoll.h>
int main(void) {
int epfd = epoll_create1(0);
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = 0;
epoll_ctl(epfd, EPOLL_CTL_ADD, 0, &event);
epoll_wait(epfd, &event, 1, -1);
perror("epoll_wait");
return 0;
}
当我自己运行这个程序时,调整终端的大小(从而生成 SIGWINCH)对它没有任何作用,它一直在等待 stdin 上的输入。当我在 strace 或 ltrace 中运行它时,SIGWINCH 会导致 epoll_wait 出现 EINTR 错误。我对 EINTR 的理解是,它仅在信号调用代码中的信号处理程序时生成,但我没有注册它们中的任何一个。我认为 strace 或 ltrace 可能已经为我设置了一个,所以我尝试将其显式设置为 SIG_IGN,但这仍然没有阻止 EINTR。为什么会这样?
他们使用
ptrace(2)
,其手册页注释然后:
默认情况下,
SIGWINCH
被忽略,但听起来好像与调用者可见的足够相似(即使重新启动)epoll
。poll
EINTR