当前位置: 技术问答>linux和unix
select()返回值,算进去了非法的fd,为什么?
来源: 互联网 发布时间:2017-04-13
本文导语: 我写了个很小的程序,创建一个管道,创建一个文件,加上一个无效的fd,同时给select函数。 select函数第一次返回时竟然返回结果是3,也就是把无效的fd也算进去了。可是我并没有指定exceptfds啊,为什么返回3呢? 我...
我写了个很小的程序,创建一个管道,创建一个文件,加上一个无效的fd,同时给select函数。
select函数第一次返回时竟然返回结果是3,也就是把无效的fd也算进去了。可是我并没有指定exceptfds啊,为什么返回3呢? 我觉得2000这个fd不应该算进去才是啊。
更奇怪的是,我是先write了这个管道,然后第一次调用select,检查是否可读的结果竟然是false。为什么?
源代码如下。
select函数第一次返回时竟然返回结果是3,也就是把无效的fd也算进去了。可是我并没有指定exceptfds啊,为什么返回3呢? 我觉得2000这个fd不应该算进去才是啊。
更奇怪的是,我是先write了这个管道,然后第一次调用select,检查是否可读的结果竟然是false。为什么?
源代码如下。
#include
#include
#include
#include
#include
#include
#include
#include
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