如何在处理多个文件描述符时使用poll()?

时间:2014-07-23 22:23:59

标签: c linux named-pipes polling

我有一个程序,它创建了许多输入命名管道,我必须使用poll()来监视这些管道,并在写入内容时获取已写入其中的信息。 。我对轮询非常陌生,我找不到很多可以清楚地展示如何对多个文件描述符使用轮询的示例。

以下是我编写代码的方法:

char buffer [1024];
size_t count = 0;
ssize_t = bytes;
    while(1)
    {
        int n = poll(pollFd, number_of_pipes, 3000);

        if(n != 0)
        {
             if (n == -1)
             {
                 perror("poll");
                 exit(1);
             }

             for(j = 0; j < number_of_pipes; j++)
             {
                 if(pollFd[j].revents & POLLIN)
                 {
                     //read the written pipe
                     if((bytes = read(fd[j], buffer, sizeof(buffer))) > 0)  
                        count += (size_t) bytes;
                 }
             }
         }
    }

但是,我不确定这是否是在使用poll()时处理多个输入管道的正确方法;因为我也不知道如何知道读取功能何时到达文件的末尾。

1 个答案:

答案 0 :(得分:1)

代码看起来不错,如果不完整(您不会显示如何设置pollFdfd数组)。它确实忽略了实际读取的数据,只计算总量;对于一个真正的程序,你可能想要对数据做些什么。

几条评论

  • 如果您将其更改为从pollFd[j].fd而不是fd[j]进行阅读,则您不需要冗余的fd数组 - 描述符必须全部在pollFd数组

  • 您没有检查EOF或读取错误 - 如果读取返回0或-1,您应该从pollFd数组中删除该条目并减少number_of_pipes