我有一个程序,它创建了许多输入命名管道,我必须使用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函数已到达文件的末尾。
代码看起来不错,如果不完整(您没有显示如何设置pollFd
和fd
数组)。它忽略了实际读取的数据,只计算总数;对于一个真正的程序,您可能想对数据做一些事情。
几个注释
-
如果您将其更改为从
pollFd[j].fd
而不是fd[j]
读取,则不需要冗余的fd
数组—描述符必须全部在pollFd
数组中 -
你不检查读取时的EOF或错误——如果读取返回0或-1,你应该从
pollFd
数组中删除该条目并减少number_of_pipes
。