- 论坛徽章:
- 0
|
本帖最后由 weichuang02 于 2013-06-03 17:51 编辑
井蛙夏虫 发表于 2013-06-03 15:06 ![]()
回复 4# weichuang02
poll专门用作监听错误:
POLLIN和POLLOUT都不指定应该可以(未测试,文档也未说明 ...
我发现select和poll还是有点区别的,我写了两个小的例子程序,做了相似的事情,也就是先创建一个管道,写入,调用select或者poll,读出,再调用select或poll
发现结果不一样。
select版,当写端pFd[1]被写入一写数据的时候,select认为它的读端pFd[0]可读状态是false。奇怪。
而poll的版本,对于两个都是有效的fd,竟然返回值是0。明明写端已经有数据了啊。
(1) select版本的小程序:
- #include <errno.h>
- #include <fcntl.h>
- #include <poll.h>
- #include <stdio.h>
- #include <string.h>
- #include <sys/select.h>
- #include <sys/types.h>
- #include <unistd.h>
- int main()
- {
- int pFd[2];
- int ret=pipe(pFd);
- if( ret == -1 )
- {
- fprintf( stderr, "poll error, %s/n", strerror( errno ) );
- return 1;
- }
- write( pFd[1], "hello", 5 );
- int nfd = open( "/tmp/my.txt", O_CREAT | O_CLOEXEC );
- fd_set fds;
- FD_ZERO( &fds );
- FD_SET( pFd[ 0 ], &fds );
- FD_SET( nfd, &fds );
- FD_SET( 2000,&fds ); //无效的fd,如何被select算进了返回值? 我没有加入exceptfds啊
- timeval timeout = { 0, 0 };
- int retval = select( 2001, &fds, &fds, NULL, &timeout ); // none block
- if( retval < 0 )
- {
- fprintf( stderr, "1st select error, %s/n", strerror( errno ) );
- return 1;
- }
- else if( retval == 0 )
- {
- printf( "No event!" );
- return 1;
- }
- printf( "1st select return=%d, pFd[0] is readable=%d\n", retval, FD_ISSET(pFd[ 0 ],&fds) );
- char buf[10]={ 0 };
- read( pFd[ 0 ], buf, sizeof( buf ) );
- retval = select( 2001, &fds, &fds, NULL, &timeout );
- if( retval < 0 )
- {
- fprintf( stderr, "2nd select error, %s/n", strerror( errno ) );
- return 1;
- }
- printf( "2nd select return=%d, pFd[0] is readable=%d\n", retval, FD_ISSET(pFd[ 0 ],&fds) );
- return 0;
- }
复制代码 程序运行的结果是
1st select return=3, pFd[0] is readable=0
2nd select return=2 pFd[0] is readable=0
很奇怪,write了管道pFd[1]之后,读端的readable竟然是false. 而且对于无效的fd=2000,select返回的时候也算进了返回值里面?
下面是poll版的:
- #include <errno.h>
- #include <fcntl.h>
- #include <poll.h>
- #include <stdio.h>
- #include <string.h>
- #include <sys/eventfd.h>
- #include <sys/types.h>
- #include <unistd.h>
- int main()
- {
- int pFd[2];
- int ret=pipe(pFd);
- if( ret == -1 )
- {
- fprintf( stderr, "poll error, %s/n", strerror( errno ) );
- return 1;
- }
- write( pFd[1], "hello", 5 );
- struct pollfd poll_list[ 2 ];
- poll_list[ 0 ].fd = open( "/tmp/my.txt", O_CREAT | O_CLOEXEC );
- poll_list[ 1 ].fd = pFd[ 0 ];
- poll_list[ 0 ].events = POLLNVAL;
- poll_list[ 1 ].events = POLLNVAL;
- int retval = poll( poll_list, 2, 0 ); // don't wait
- if( retval < 0 )
- {
- fprintf( stderr, "1st poll error, %s/n", strerror( errno ) );
- return 1;
- }
- printf( "1st poll return=%d\n", retval );
- printf( "1st fd[0].revents=0x%x,fd[1].revents=0x%x\n", poll_list[ 0 ].revents, poll_list[ 1 ].revents );
- char buf[10]={ 0 };
- read( pFd[ 0 ], buf, sizeof( buf ) );
- retval = poll( poll_list, 2, 0 ); // don't wait
- if( retval < 0 )
- {
- fprintf( stderr, "2nd poll error, %s/n", strerror( errno ) );
- return 1;
- }
- printf( "2nd poll return=%d\n", retval );
- printf( "2nd fd[0].revents=0x%x,fd[1].revents=0x%x\n", poll_list[ 0 ].revents, poll_list[ 1 ].revents );
- return 0;
- }
复制代码 运行结果是
1st poll return=0
1st fd[0].revents=0x0,fd[1].revents=0x0
2nd poll return=0
2nd fd[0].revents=0x0,fd[1].revents=0x0
我的程序有什么问题么? |
|