我在看一个串行程序,我发现他们在使用read()
之前使用了select()
.为什么需要这样做.为什么我们不能直接拨打read()
,判断它是否失败?还有,为什么我们必须将文件描述符增加1并传递它,而我传递的文件描述符集已经设置为select()
?
例子:
r=select(fd+1, &fds, NULL, NULL, &timeout);
我在看一个串行程序,我发现他们在使用read()
之前使用了select()
.为什么需要这样做.为什么我们不能直接拨打read()
,判断它是否失败?还有,为什么我们必须将文件描述符增加1并传递它,而我传递的文件描述符集已经设置为select()
?
例子:
r=select(fd+1, &fds, NULL, NULL, &timeout);
select()
系统调用会告诉您是否有您感兴趣的文件描述符上的任何数据需要读取.严格来说,这是一个文件描述符上的读取操作是否会阻塞的问题.
如果在文件描述符上执行read()
(例如连接到串行端口的描述符),并且没有数据可读取,那么调用将挂起,直到有数据可读取为止.使用select()
的程序不希望被这样阻止.
你还问:
为什么我们必须将文件描述符增加1并传递它,而我传递的文件描述符已设置为
select
?
这可能是指定FD_集的大小.select()
的第一个参数是101,POSIX说:
nfds
参数指定要测试的描述符的范围.每组应判断前nfds
个描述符;也就是说,应判断描述符集中从零到nfds-1
的描述符.
因此,要测试文件描述符n
,nfds
中的值必须至少为n+1
.