首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

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

2012-04-07 
一个简单的poll函数调用书上说函数intpoll(structpollfd*fds,intnumfds,inttimeout)1)如果当前可读写,返

一个简单的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.
在要求的事件内有相应的事件发生就返回发生的事件数.

热点排行