当前位置: 首页 > 面试题库 >

为什么没有输入,民意调查仍会返回?

杨良才
2023-03-14
问题内容

我编写了一个小测试程序以弄清楚如何与人交谈poll。我创建了三个文件testatestbtestc和写入字符串hello\n到第一。因此,这是我的调用poll

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

根据联机帮助页,超时-1应指示syscall永不超时。但是,它不断返回而没有任何内容可供读取。我总是消耗输入的一个字节,并且可以看到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内核上构建。


问题答案:

常规文件中的EOF条件仍然可读。换句话说,您read()将不会受阻。这是一个很好的列表,说明poll()了不同类型的文件描述符中不同的EOF
实现如何反应:http :
//www.greenend.org.uk/rjk/tech/poll.html

请注意,常规文件始终返回POLLIN。因此,您需要单独测试EOF。实际上,对常规文件进行轮询对您没有任何帮助。您将需要套接字或管道或其他东西来测试您的代码。

其他注意事项:您可能要检查中的其他结果.revents。POLLERR,POLLHUP和POLLNVAL都发出不同的错误情况信号,并且需要特殊处理。



 类似资料:
  • 问题内容: 这是我非常简单的表格(Postgres): 如果我尝试使用FROM数据库下面的命令插入String,那么一切都会按预期工作,不足为奇的是,数据库中会出现一个新行。 但是,如果我想通过JDBC插入字符串,则不会插入任何内容,尽管prepareStatement.executeUpdate()始终返回1。 下面是我的方法应该起作用,但是没有起作用。请告诉我是否缺少明显的东西。我想补充一点,

  • 我有一个简单的Kafka 2.4.1(Confluent 5.4.1)安装程序在本地Docker中运行。并且我使用了用Java编写的测试生产者和测试使用者。该代码可在GitHub中获得。 单元测试做: 生成器向单个分区主题生成一条消息 用户订阅该主题并在Kafka中查询可用消息 问题是:使用者的第一次运行将跳过主题中已经生成的可用消息。真正的问题是,那些错过的消息会丢失(从使用者的角度来看:偏移量

  • 在本章中,我们将研究如何在Drupal中创建Poll module 。 此模块可帮助您为您的网站创建民意调查。 您可以提出问题,提供任意数量的答案,您的访问者也可以投票。 以下是创建Poll Module的步骤。 Step 1 - 单击菜单栏中的“ Module ”。 Step 2 - 启用“ Poll module ,然后单击“ Save Configuration 。 Step 3 - 单击“

  • 问题内容: HTML5 doctype示例。 无论IE9和Chrome14日志作为内部元素 HTML5规范明确指出: 后跟零个或多个tbody元素或一个或多个tr元素 此外。HTML5规范明确指出: 作为table元素的子元素,在任何标题,colgroup和thead元素之后,但仅当没有tbody元素成为table元素的子元素时。 为什么浏览器会破坏我的DOM并注入一个when 我没有要一个 没有

  • 我可以想到许多地方,C语言中的联合有助于节省内存。因为Rust是一种系统编程语言,为什么它不支持联合呢?

  • 根据keras文件(https://keras.io/layers/convolutional/)Conv1D输出张量的形状为(batch\u size,new\u steps,filters),而输入张量的形状为(batch\u size,steps,input\u dim)。我不明白这是怎么回事,因为这意味着如果你传递一个长度为8000的1d输入,其中batch\u size=1,steps=