为什么在Linux中使用的选择(Why is select used in Linux)

2019-07-18 18:45发布

我正在经历一个串行程序,我发现,他们使用select()使用前read() 到底为什么是这样要求的。 为什么不能我们只是直接调用read()并检查它是否失败或不是? 同时我们为什么必须由1递增文件描述符,并通过它,而我传递的文件描述符设置已经到select()

例:

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

Answer 1:

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

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

你还问:

为什么我们用1来增加文件描述符,并通过它,而我传递的文件描述符设置已经到select

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

所述nfds参数指定要测试的描述符的范围。 第一nfds描述符必须在每个组进行检查; 即,从零到所述描述符nfds-1在描述符集应被检查。

所以,测试一个文件描述符n ,在值nfds必须至少为n+1



Answer 2:

希望继续运行, 同时读取用户的交互式输入1需要的程序是多线程的, 或者它们需要读取输入流认真,具体地,有条件地。

Select(2)可被用于实现所述第二设计模式。 它可确定是否输入可以不受阻塞整个应用程序读取。


1.或者其他一些输入到达不可预知的。



Answer 3:

您可以使用select调用时,你必须不断地监视文件描述符,直到他们准备好一些IO不会阻塞。

当你想IO一般使用(例如阅读())无阻塞,阅读: 男人页

也可以参考相关的API



文章来源: Why is select used in Linux