Considere este programa:
#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;
}
Quando executo este programa por si só, redimensionar o terminal (gerando assim SIGWINCH) não faz nada com ele e continua aguardando entrada em stdin. Quando eu executo dentro de strace ou ltrace, o SIGWINCH resulta em erro de epoll_wait com EINTR. Meu entendimento do EINTR é que ele só é gerado se um sinal chamar um manipulador de sinal em seu código, mas não tenho nenhum deles registrado. Eu pensei que strace ou ltrace poderia estar configurando um para mim, então tentei defini-lo explicitamente como SIG_IGN, mas isso ainda não impediu o EINTR. Por que isso está acontecendo?
Eles usam
ptrace(2)
, cuja página de manual comentae depois:
Por padrão,
SIGWINCH
é ignorado, mas soa como seepoll
fosse semelhante o suficiente parapoll
queEINTR
seja visível para o chamador (mesmo com a reinicialização).