为什么选择在Linux中使用

时间:2013-01-27 05:09:01

标签: c linux file-descriptor select-syscall

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

示例:

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

的值

3 个答案:

答案 0 :(得分:40)

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

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

你也问:

  

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

这可能是指定FD_SET 的大小,但可能做得很糟糕select()的第一个参数称为 nfds ,POSIX说:

  

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

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

答案 1 :(得分:6)

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

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


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

答案 2 :(得分:3)

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

通常在您希望IO(例如read())无阻塞时使用,请阅读:man page

另请阅读相关API的