读书人

一个简单的poll函数调用解决方法

发布时间: 2012-04-07 17:31:52 作者: rapoo

一个简单的poll函数调用
书上说函数int poll(struct pollfd * fds, int numfds, int timeout);
1)如果当前可读写,返回读写信息。
2)如果当前不可读写,则阻塞进程,并等待驱动程序唤醒,重新调用poll函数,或超时返回。
但是我实验时却发现他并没有阻塞进程,不知道是为何?
源码如下:
#include <fcntl.h>
#include <stdio.h>
#include <sys/poll.h>
#include <unistd.h>

int main(void)
{
struct pollfd fds[2];
char buf[4096];
int i,rc;

if((fds[0].fd=open( "p1 ",O_RDONLY | O_NONBLOCK)) <0)
{
perror( "open p1 ");
return 1;
}
if((fds[1].fd=open( "p2 ",O_RDONLY | O_NONBLOCK)) <0)
{
perror( "open p2 ");
return 1;
}
fds[0].events=POLLIN;
fds[1].events=POLLIN;

while(fds[0].events || fds[1].events)
{
if(poll(fds,2,0)==-1)
{
perror( "poll ");
return 1;
}
for(i=0;i <2;i++)
{
if(fds[i].revents)
{
rc=read(fds[i].fd,buf,sizeof(buf)-1);


if(rc <0)
{
perror( "read ");
return 1;
}
else if(!rc)
{
fds[i].events=0;
}
else
{
buf[rc]= '\n ';
printf( "read:%s ",buf);
}


}
}
}
return 0;
}

"p1 "和 "p2 "是两个管道
当我没有向这两个管道里输入内容时if(poll(fds,2,0)==-1)应该阻塞,但是我在gdb里跟踪时发现并没有阻塞,是何原因?

[解决办法]
if(poll(fds,2,0)==-1)

你的超时时间是0!!

这样它就会立即返回的.它的用途就是等待一定的时间,来检查事件事件是否发生,如果出错,就立即返回-1.
超时返回0.
在要求的事件内有相应的事件发生就返回发生的事件数.

读书人网 >UNIXLINUX

热点推荐