Por que a pesquisa continua retornando, embora não haja entrada?
Eu escrevi um pequeno programa de teste para descobrir como falarpoll
. Eu criei três arquivostesta
,testb
,testc
e escreveu a stringhello\n
para o primeiro. Então, aqui está a minha invocação depoll
:
poll(polls.data(),polls.size(),-1)
De acordo com a manpage, um timeout de-1
deve indicar que o syscall nunca expira. No entanto, ele continua retornando sem ter nada para ler. Eu sempre consome um byte da entrada e posso ver ohello\n
sendo impresso, mas a enquete não para por aí. Apenas continua fingindo que há algo para ler.
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <sys/poll.h>
#include <unistd.h>
#include <errno.h>
#include <vector>
#include <map>
#include <string>
#include <iostream>
typedef int fd_t;
int main() {
fd_t const a = open("testa",O_RDONLY);
fd_t const b = open("testb",O_WRONLY);
fd_t const c = open("testc",O_RDWR);
std::map<fd_t,std::string> names{{{a,"testa"},{b,"testb"},{c,"testc"}}};
std::vector<pollfd> polls;
polls.push_back(pollfd{a, POLLIN, 0});
polls.push_back(pollfd{b, 0, 0});
polls.push_back(pollfd{c, POLLIN, 0});
while (poll(polls.data(),polls.size(),-1)) {
for (auto p : polls) {
if ((p.revents & (POLLIN|POLLERR)) == POLLIN) {
std::cout << "{" << p.fd << ", " << p.events << ", " << p.revents << "} ";
char byte;
auto const rr = read(p.fd,&byte,1);
auto const en = errno;
if (rr) {
std::cout << "File " << names[p.fd] << " says something: '" << ((int)byte) << " (" << (((' '<byte) && (byte<127))?byte:'\0') << ")" << "' \n";
} else {
std::cout << "Strange (file " << names[p.fd] << "). errno says " << en << "\n";
}
}
}
}
}
O que eu recebo é isto:
{3, 1, 1} File testa says something: '104 (h)'
{5, 1, 1} Strange (file testc). errno says 0
{3, 1, 1} File testa says something: '101 (e)'
{5, 1, 1} Strange (file testc). errno says 0
{3, 1, 1} File testa says something: '108 (l)'
{5, 1, 1} Strange (file testc). errno says 0
{3, 1, 1} File testa says something: '108 (l)'
{5, 1, 1} Strange (file testc). errno says 0
{3, 1, 1} File testa says something: '111 (o)'
{5, 1, 1} Strange (file testc). errno says 0
{3, 1, 1} File testa says something: '10 ()'
{5, 1, 1} Strange (file testc). errno says 0
{3, 1, 1} Strange (file testa). errno says 0
{5, 1, 1} Strange (file testc). errno says 0
{3, 1, 1} Strange (file testa). errno says 0
{5, 1, 1} Strange (file testc). errno says 0
{3, 1, 1} Strange (file testa). errno says 0
{5, 1, 1} Strange (file testc). errno says 0
{3, 1, 1} Strange (file testa). errno says 0
{5, 1, 1} Strange (file testc). errno says 0
(repete as últimas duas linhas para sempre)
Estou construindo comg++ -Wall -Wextra -std=c++11 poll.cpp -o poll
no kernel 3.10-2-amd64.