gpt4 book ai didi

c++ - 为什么没有输入,poll 一直返回?

转载 作者:IT王子 更新时间:2023-10-29 01:08:43 25 4
gpt4 key购买 nike

我写了一个小测试程序来弄清楚如何与 poll 交谈.我创建了三个文件 testa,testb,testc 并将字符串 hello\n 写入第一个。所以,这是我对 poll 的调用:

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

根据联机帮助页,-1 的超时应该表明系统调用永远不会超时。但是,它一直返回而没有任何内容可读。我总是消耗一个字节的输入,并且可以看到正在打印的 hello\n,但 poll 并不止于此。它只是继续假装有东西可读。

#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

(永远重复最后两行)

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

最佳答案

常规文件中的 EOF 条件仍然是可读的。换句话说,您的 read() 不会阻塞。以下是不同类型的文件描述符中 poll() 的不同实现如何对 EOF 使用react的很好的列表:http://www.greenend.org.uk/rjk/tech/poll.html

请注意,常规文件总是返回 POLLIN。所以你需要单独测试EOF。事实上,对常规文件的轮询不会为您做任何事情。您将需要套接字或管道或其他东西来测试您的代码。

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

关于c++ - 为什么没有输入,poll 一直返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18616716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com