问题描述
我写了一个小测试计划,以了解如何与我创建了三个文件 testa
, testb
, testc
将字符串 hello\\\
添加到第一个。所以,这里是我调用
poll
:
I wrote a small test program to figure out how to talk to poll
. I created three files testa
,testb
,testc
and wrote the string hello\n
to the first. So, here is my invocation of poll
:
poll(polls.data(),polls.size(),-1)
-1
应该表示系统调用从不超时。但是,它保持返回没有任何东西阅读。我总是消耗一个字节的输入,可以看到 hello\\\
正在打印,但poll不停止。它只是继续假装有东西要读。
According to the manpage, a timeout of -1
should indicate that the syscall never times out. However, it keeps returning without having anything to read. I always consume one byte of the input and can see the hello\n
being printed, but poll doesn't stop there. It just keeps on pretending there to be something to read.
#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";
}
}
}
}
}
$ b b
我得到的是:
What I get is this:
{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
(永远重复最后两行)
我在3.10-2-amd64内核上使用 g ++ -Wall -Wextra -std = c ++ 11 poll.cpp -o poll
构建。
I'm building with g++ -Wall -Wextra -std=c++11 poll.cpp -o poll
on the 3.10-2-amd64 kernel.
推荐答案
常规文件中的EOF条件仍然可读。换句话说,你的 read()
不会阻塞。这里有一个很好的列表,其中 poll()
在不同类型的文件描述符中对EOF作出反应:
An EOF condition in a regular file is still readable. In other words, your read()
won't block. Here's a nice list of how different implementations of poll()
react to EOF in different sorts of file descriptors: http://www.greenend.org.uk/rjk/tech/poll.html
注意,常规文件总是返回POLLIN。所以你需要单独测试EOF。事实上,轮询常规文件不会为您做任何事情。
Note that regular files always return POLLIN. So you need to test for EOF separately. In fact, poll on a regular file doesn't do anything for you. You'll need sockets or pipes or something to test your code.
其他注释:您可能想要检查 .revents
Other notes: you probably want to check for other results in .revents
. POLLERR, POLLHUP, and POLLNVAL all signal different error conditions, and need special handling.
这篇关于为什么投票继续返回,虽然没有输入?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!