Eu estava usando epoll através da libev e acertei esse comportamento estranho.
Suponha que eu tenha um evento de leitura disponível e não leia todos os dados do descritor de arquivo. Como a libev usa trigger de nível, devo continuar recebendo o evento de leitura.
E isso era verdade, se eu apenas lesse o descritor. Mas se eu também escrever para ele, haverá um problema.
i.e. Eu recebo um evento de leitura, leio parte dos dados do descritor e, em seguida, escrevo algo no descritor. Depois, nenhum outro evento de leitura será recebido até que novos dados estejam disponíveis nesse descritor.
Eu me pergunto se esse comportamento está documentado em algum lugar, ou isso é um bug no Linux?