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

标签 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() 时处理多个输入管道的正确方法;因为我也不确定如何知道 read 函数何时到达文件末尾。

最佳答案

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

一些评论

  • 如果将其更改为从 pollFd[j].fd 而不是 fd[j] 读取,则不需要多余的 fd array -- 描述符必须都在pollFd array

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

关于c - 处理多个文件描述符时如何使用 poll()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24922069/

相关文章:

c++ - 命名管道客户端错误 5 (C++)

bash - 如何使用 bash 冲洗管道

c - C 上的预处理器

linux - 为 2 个内核分区 Beaglebone 内部 mmc

c - 创建数组的动态声明

linux - 如何检测带有单引号或双引号的参数?

linux - 在 Windows 的 samba 导出的 linux 目录上创建符号链接(symbolic link)

c# - 什么是 NamedPipeServerStream 和 NamedPipeClientStream(s)?

c11:使用 _Generic 引发 SIGSEGV

c - Graphviz 作为库错误 : too many arguments to function ‘agnode’