虽然没有任何投入,为什么投票仍在返回?

我写了一个小testing程序来弄清楚如何与poll进行交谈。 我创build了三个文件testatestbtestc ,并将stringhello\n写入第一个。 所以,这里是我的poll

 poll(polls.data(),polls.size(),-1) 

根据手册页,超时-1应表明系统调用永远不会超时。 然而,它没有任何东西可以读。 我总是消耗一个字节的input,可以看到你打印的hello\n ,但民意调查并没有停止在那里。 它只是假装在那里有东西要读。

 #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"; } } } } } 

我得到的是这样的:

 {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 

(永远重复最后两行)

我用g++ -Wall -Wextra -std=c++11 poll.cpp -o poll 3.10-2-amd64内核。

Solutions Collecting From Web of "虽然没有任何投入,为什么投票仍在返回?"

常规文件中的EOF条件仍然可读。 换句话说,你的read()不会被阻塞。 这里有一个不同的poll()实现如何在不同类型的文件描述符中对EOF做出反应的好列表: http : //www.greenend.org.uk/rjk/tech/poll.html

请注意,常规文件总是返回POLLIN。 所以你需要单独测试EOF。 事实上,对普通文件进行民意调查并不能为你做任何事情。 您将需要套接字或管道或东西来测试您的代码。

其他注意事项:您可能想检查.revents其他结果。 POLLERR,POLLHUP和POLLNVAL都表示不同的错误条件,需要特殊处理。

本地文件描述符总是准备好执行I / O(不同于套接字,因为它们依赖于内核内部I / O缓冲区))。 在你的情况下,文件描述符总是准备好读取,即使它们实际上是空的。

一旦你到达一个文件的结尾,它仍然是可读的,所以poll将立即返回,调用read将立即返回零。 您需要处理这种情况,也许可以通过关闭它并将其从您正在打印“ Strange的投票组中删除。