c - 为什么在 Linux 中使用 select



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

例:

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

select()系统调用告诉您在感兴趣的文件描述符上是否有任何要读取的数据。 严格来说,这是文件描述符上的读取操作是否会阻塞的问题。

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

你还会问:

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

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

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

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

想要在读取交互式用户输入1 的同时继续运行的程序需要多线程,或者它们需要仔细读取输入流,特别是有条件地读取输入流。

Select(2)可用于实现第二种设计模式。它可以确定是否可以在不阻塞整个应用程序的情况下读取输入。


1. 或其他一些不可预测的输入。

当您必须持续监视文件描述符直到它们为某些 IO 做好准备而不会阻塞时,可以使用 select 调用。

一般在想要IO(例如read())非阻塞时使用,阅读:man页

另请阅读相关 API 的

相关内容

  • 没有找到相关文章

最新更新