一尘不染

为什么在Linux中使用select

linux

我正在查看一个串行程序,观察到它们在使用select()之前先使用过read()。为什么这是必需的。为什么我们不能直接致电read()并检查是否失败?另外,为什么要在我已经将文件描述符设置为传递时将文件描述符增加1并传递它select()呢?

例:

r=select(fd+1, &fds, NULL, NULL, &timeout); fds已经具有fd的值


阅读 577

收藏
2020-06-03

共1个答案

一尘不染

select()系统调用告诉你是否有任何数据的文件描述符你感兴趣的。严格来说,它是文件描述符的读操作是否会阻止或不是一个问题读取。

如果您read()在文件描述符(例如连接到串行端口的文件描述符)上执行,并且没有要读取的数据,则该调用将挂起,直到有一些数据要读取为止。使用的程序select()不希望那样被阻止。

您还问:

为什么在我已经将文件描述符设置为的同时,我们必须将文件描述符增加1并传递它select呢?

这可能是指定FD_SET的大小。的第一个参数select()称为 nfds ,POSIX说:

nfds参数指定要测试的描述符的范围。nfds在每个集合中应检查第一个描述符;也就是说,nfds-1应检查描述符集中从零到零的描述符。

因此,要测试文件描述符n,in中的值nfds必须至少为n+1

2020-06-03