我正在查看一个串行程序,观察到它们在使用select()之前先使用过read()。为什么这是必需的。为什么我们不能直接致电read()并检查是否失败?另外,为什么要在我已经将文件描述符设置为传递时将文件描述符增加1并传递它select()呢?
select()
read()
例:
r=select(fd+1, &fds, NULL, NULL, &timeout); fds已经具有fd的值
r=select(fd+1, &fds, NULL, NULL, &timeout);
该select()系统调用告诉你是否有任何数据的文件描述符你感兴趣的。严格来说,它是文件描述符的读操作是否会阻止或不是一个问题读取。
如果您read()在文件描述符(例如连接到串行端口的文件描述符)上执行,并且没有要读取的数据,则该调用将挂起,直到有一些数据要读取为止。使用的程序select()不希望那样被阻止。
您还问:
为什么在我已经将文件描述符设置为的同时,我们必须将文件描述符增加1并传递它select呢?
select
这可能是指定FD_SET的大小。的第一个参数select()称为 nfds ,POSIX说:
nfds
该nfds参数指定要测试的描述符的范围。nfds在每个集合中应检查第一个描述符;也就是说,nfds-1应检查描述符集中从零到零的描述符。
nfds-1
因此,要测试文件描述符n,in中的值nfds必须至少为n+1。
n
n+1