当前位置: 首页 > 面试题库 >

为什么在Linux中使用select

呼延明朗
2023-03-14
问题内容

我正在查看一个串行程序,观察到它们在使用select()之前先使用过read()。为什么这是必需的。为什么我们不能直接致电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应检查描述符集中从零到零的描述符。

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



 类似资料:
  • 我使用Win 10 Pro N(版本1709)作为开发机器,使用Windows Server 2016 Standard(版本1607)作为生产服务器。 我目前正在开发一个使用MongoDb作为数据库的ASP.NET Core2应用程序。 几天前,我第一次偶然发现了这个想法,将MongoDb作为Docker映像运行。 这是个好决定吗?或者在我的场景中我应该使用Linux容器而不是Windows容器

  • 问题内容: Java不能执行运算符重载,但可以用于和和其他一些类。这怎么可能? 更新: 为什么这样做? 问题答案: 不是操作员重载的示例。在语言中被内置为合并运算符 和 算术加法运算符。 这意味着用Java编写程序的人不能重载运算符,但是就Java语言的语法而言,它被定义为连接和加法运算符。 编辑 它适用于其他类,如和由于自动装箱。 如果您看一下执行字符串连接的Java程序的字节码,您会发现它创建

  • 问题内容: 我只是想知道为什么在类的方法中使用质数?例如,当使用生成我的方法时,总是使用素数31: 问题答案: 因为您想要乘以的数量以及要插入的存储桶的数量具有正交素数分解。 假设要插入8个桶。如果您要用来乘以的数字是8的倍数,则插入的存储桶将仅由最低有效项(一个根本没有相乘)确定。类似的条目将发生冲突。不适用于哈希函数。 31是一个足够大的素数,因此不可能被它整除(实际上,现代的Java Has

  • 本文向大家介绍为什么要在R中使用set.seed?,包括了为什么要在R中使用set.seed?的使用技巧和注意事项,需要的朋友参考一下 set.seed的使用是为了确保我们获得相同的随机结果。如果我们为R或任何统计软件中的任何任务随机选择一些观测值,则它始终会产生不同的值,这是由于随机化而发生的。如果我们想保留在第一次随机选择时产生的值,则可以通过在随机化之后将它们存储在一个对象中来实现,或者可以

  • 问题内容: 我知道有很多文章可以解释如何在Java EE中使用CDI,但是我很难弄清楚这实际上带来了什么好处。例如,假设我有一个当前使用Foo实例的类。我可能会做 要么 我一直在阅读CDI,我可以做到: 但是为什么这比以前的基于工厂的方法更好呢?我认为还有一些我不知道的用例,但我无法识别。 如果我理解下面的响应,则概念是DI框架充当集中配置的主对象工厂。这是合理的解释吗? 更新资料 从那时起,我就

  • 我喜欢通过摆弄代码来学习,最近我复制并粘贴了一个随机数生成器代码。然后我删除了所有代码行,这些代码行对于生成一个随机数来说是不必要的。最后一根稻草是我删除了srand中的“时间”。 (无符号) 时间(0)); 这里的“时间(0)”是什么意思? 它使用程序打开的时间来生成随机数的种子吗?这就是为什么删除它(时间)会使它不起作用吗?因为它没有种子? 而且 这是整个代码,我注意到它使用“rand”结果进